Channel types
通道是通过 发送 和 接收 同一种数据类型的数据来实现 并发执行函数 这样一种机制,未初始化的通道数值统一为 nil
。
ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .
这个可选的操作符 <-
指定通道的数据流通方向, 双向, 发送 或者 接收,如果没有指明方向,则默认通道是 双向。 通道也可以通过 分配或显式转换 来限度只发送还是只接收。
chan T // 可用于数据类型为 T 的发送和接收
chan<- float64 // 只能用于发送数据类型为 float64 的数据
<-chan int // 只能用于数据类型为 int 的数据接收
<-
运算符与最左侧的chan
关联:
chan<- chan int //与 chan <-(chan int) 相同
chan<- <-chan int // 与 chan <-(<-chan int) 相同
<-chan <-chan int // 与 <-chan(<-chan int) 相同
chan (<-chan int)
通过内置函数 make
可以初始化一个新的通道,它需要一个通道类别跟可选的通道 容量 作为初始化参数:
make(chan int, 100)
通道容量,指的是通道里面可以缓存的数据个数,如果这个容量是 0 或者 忽略没有指定的话,这个通道不能用于缓存并只有在接收双方都准备就绪时才能成功通信。否则,通道会将数据缓存起来并当发送方缓存未满而接收方缓存非空时继续通信, nil
的通道永远不能用于通信。
通过内置函数 close
可以关闭一个通道,而 接收操作器 的返回值可以判断数据是否在通道关闭前发送出去。
任意数量的 goroutine 都可以通过这些方法来操作一个通道,发送,接收,或者内置函数 cap
和 len
。通道是一个先进先出的队列,比如说一个 goroutine 在通道里发送了一个数据,另外一个 goroutine 接收数据的时候,会是以数据发送的顺序接收到的。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: