Skip to content

Go指南教程

Zhong Qin edited this page Jul 10, 2018 · 6 revisions

教程地址

共分为三个模块讲解

1 基础

1.1 包、变量和函数

学习 Go 程序的基本组件

1.2 流程控制语句

学习如何用条件、循环和开关语句控制代码的流程

1.3 复杂类型

学习如何基于已有类型定义新的类型

需要注意的是,在使用map时一定要先make申请内存空间后才能对其进行操作。

2 方法和接口

用它们来定义对象和其行为

2.1 方法

方法接收者出现在 func 关键字和方法名之间的参数中。

注意首字母大写为公有方法,小写为私有方法

指针调用,方法接收者使用指针调用可以修改结构体的值,否则只是值拷贝,不影响原指向的值。方法的接收者是什么类型,调用方法或接口时的变量就应该是对应的类型,不可以混用。

不能对来自其他包的类型或基础类型定义方法。

2.2 接口

在接口中只是对方法进行声明,格式为:函数名(参数列表) (返回值列表)

不需要添加func关键字

3 并发

概览goroutinechannel,以及如何使用它们来实现不同的并发模式

channel

channel 是有类型的管道,使用前必须创建,可以用 channel 操作符 <- 对其发送或者接收值(箭头”就是数据流的方向。)

默认情况下,在另一端准备好之前,发送和接收都会阻塞。这使得 goroutine 可以在没有明确的锁或竞态变量的情况下进行同步。

make 提供第二个参数作为缓冲长度来初始化一个缓冲 channel

// 放入超过缓冲区长度的数据
c := make(chan int, 1)
c <- 1
c <- 2
fmt.Println(<-c)
// fatal error: all goroutines are asleep - deadlock!

range 和 close

只有发送者才可以关闭一个管道;可以利用range获得管道中的每一个元素,直到它被关闭。向一个已经关闭的 channel 发送数据会引起 panic;也可以利用v, ok := <-ch判断管道中是否还有元素。

select

select 语句使得一个 goroutine 在多个通讯操作上等待。

select 会阻塞,直到条件分支中的某个可以继续执行,这时就会执行那个条件分支。当多个都准备好的时候,会随机选择一个。

当 select 中的其他条件分支都没有准备好的时候,default 分支会被执行。

其他

go中不支持函数重载,一个文件中不允许存在同名函数,否则报错redeclared in this block

go中定义的匿名函数,同时执行调用,要在{}跟上()进行调用,否则函数只是被定义了并未执行

Clone this wiki locally