## 通道(channel) #### 基本概念 1.什么是channel 简单来说channel就是goroutine之间消息**通信机制**。 2.如何创建一个channel 使用内置make函数来创建一个通道 ```go ch := make(chan int)//ch 的类型是`chan int` ``` 跟map一样,通道是一个使用make创建的数据结构的**引用**。 当赋值或者作为参数传递到一个函数的时候,复制的是引用。 #### 主要操作 通道有两个主要操作:发送和接收,两者统称为通信。 还有第三种操作,close 由此可引发出单向通道类型。 ```go chan_read := <-chan int // 单向读 chan_write := chan<- int //单向写 ``` #### 基本用法 举个例子说明一下channel的用法: ```go select { case <- chan1: // 如果chan1成功读到数据 case chan2<- 1: // 如果成功向chan2写入数据 default: // 默认分支 } ``` 如果需要防止超时,需要加上:time.After() ```go //防止读超时 select { case <- time.After(time.Second*2): println("read channel timeout") case i := <- chan_read: println(i) } ``` #### 应用 可以通过channel来做时间控制,代码按照先后循序完成才能执行。 在读取到chan1后,才能执行B()。 A和B可能在不同的函数体力。 ```go chan1 := make(chan int) go A() <- chan1 go B() ```