在golang中,如果涉及消息传递或者是并发控制等,我们常常用到 channel,channel的具体原理这里不讨论,今天主要看看有无缓冲以及缓冲值的设计。
无缓冲的channel
联系 channel 的数据结构 mchan 可知,就没得 buf,但 sendq recvq 这些肯定都是有的,所以在无缓冲的 channel 中,如果写者写入 channel 而没有 读者来读取数据的话,这时的写入肯定是阻塞的,同样适用于只有读者没有写者的场景,只有当读者写者都具备的情况下才会正常读写,否则阻塞或者是形成死锁。
下面看几个例子。
同个goroutine中单读channel
func TestNoCacheChanOnlyRd(t *testing.T) {
inChan := make(chan int, 0)
<-inChan
}
同个goroutine中单写channel
func TestNoCacheChanOnlyWr(t *testing.T) {
inChan := make(chan int, 0)
inChan <- 1
}
同个goroutine中有写有读
func TestNoCacheChanWrAndRd(t *testing.T) {
inChan := make(chan int, 0)
inChan <- 1
<-inChan
}
不同goroutine中读写
func TestNoCacheChanWrAndRdInDiffGoroutine(t *testing.T) {
inChan := make(chan int)
go func() {
fmt.Println("写入到num:", 1)
inChan <- 1
close(inChan)
}()
go func() {
num := <-inChan
fmt.Println("读取到num:", num)
}()
time.Sleep(time.Second)
fmt.Println("主进程退出")
}
除了最后一个情况,其他情况全部都是要 deadLock 的,不信可以自己运行下。
有缓冲的channel
标签:testing,int,缓冲,cap,golang,func,inChan,channel From: https://www.cnblogs.com/davis12/p/18086394