如果说 goroutine 是Go程序并发的执行体,channel就是它们之间的连接。channel是可以让一个 goroutine 发送特定值到另一个 goroutine 的通信机制,信道是引用类型,初始化为nil Go 语言中的通道(channel)是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出(First In First Out)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也就是声明channel的时候需要为其指定元素类型 var 信道实例 chan 信道类型  // 创建信道 信道实例 := make(chan 信道类型)  // 创建并实例化信道 ​ func Printhello(c chan string) { fmt.Println("其他goroutine执行开始") c<-"hello"  // 往信道中放值 } ​ func main() { fmt.Println("主goroutine执行开始") ​ // 信道是一种类型,定义信道 var a chan string=make(chan string)  // chan是信道类型关键字,string表示信道到存string类型,使用make进行初始化 go Printhello(a)   // 执行其他goroutine b:=<-a  // 接收其他goroutine往信道中取值 fmt.Println(b)  // hello fmt.Println("主goroutine执行结束") } ​ // 将信道中存值为空接口类型可放任意类型数据 var a chan interface{}=make(chan interface{}) ​ // 信道的取值和赋值默认都是阻塞的 func main() { var c chan int=make(chan int) fmt.Println("主goroutine") go Recive(c) c<-1  // 由goroutine发送就必须由goroutine接收,否则会报死锁 } ​ func Recive(c chan int){ d:=<-c fmt.Println("信道中取值",d) } ​ // 缓冲信道和无缓冲信道 // 创建有缓冲信道,允许信道里存储一个或多个数据,这意味着,设置了缓冲区后,发送端和接收端可以处于异步的状态;无缓冲信道的个数为0,在信道里无法存储数据,这意味着,接收端必须先于发送端准备好,以确保你发送完数据后,有人立马接收数据,否则发送端就会造成阻塞,原因很简单,信道中无法存储数据,也就是说发送端和接收端是同步运行的。 var a chan int= make(chan int, 3) a<-999 a<-866 fmt.Println(<-a) go Recive(a) ​ // 长度和容量:长度(信道中有几个值),容量(初始化容量大小) fmt.Println(len(a)) fmt.Println(cap(a)) ​ // 双向信道和单向信道 ​ 复制代码