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的关闭状态

 

posted @ 2023-04-26 10:03  方达达  阅读(43)  评论(0)    收藏  举报