go channel 双向通道和单向通道
go 语言中,channel一般默认是双向通道,但是也可以进行双向通道定义
var ch1 chan int // ch1为一个双向通道
var ch2 chan<- int // ch2为一个只能接收的单向通道
var <-chan int // ch3为一个只能发送的单向通道
注意:可以将普通的双向channel隐式转换为单向channel,不能将单向channel转换为双向channel。
阻塞情况:
chan无缓冲时,从chan读取数据会阻塞,直到有协程向chan写入数据。向chan写入数据也会阻塞,直到有协程读取数据。
chan有缓冲时,从chan读取数据,如果缓冲区中没有数据,那么也会阻塞,直到有协程写入数据。向chan写入数据,如果缓冲区已经满了,也会阻塞,直到有协程从chan中读取数据。
对于nil的chan,不管是读还是写,都是永久阻塞。 – 这个一定注意。
i := <- ch
j, ok := <- ch
只有在缓存区没有数据了,ok值才能代表chan已经关闭
当chan没有缓存区的时候,第二个值可以认为是chan的关闭状态

浙公网安备 33010602011771号