channel探究
😅

channel探究

Tags
Golang
channel
Published
April 3, 2024
Author
zhichao
Language
Source

使用channel的时候,出现报错:

fatal error: all goroutines are asleep - deadlock!

一、读一个没关闭,且现在将来也不会有数据的一个channel,无论是有缓冲还是没缓冲。

type Dzc struct{ } sig := make(chan Dzc) fmt.Println(<-sig) sig1 := make(chan Dzc,1) fmt.Println(<-sig1)
死锁原因,无论你有缓冲还是没缓冲,生产者不生产了就代表没数据,但是消费者一直想取数据,一直等,就死锁了呗。程序一直退不出去。

这样不会死锁

go func() { fmt.Println(<-sig) }() go func(){ fmt.Println(<-sig1) }()
因为这样我后面主程序直接退出了,不会导致程序一直退不出去。

这样也不会死锁

type Dzc struct{ } sig := make(chan Dzc) close(sig) fmt.Println(<-sig) close(sig1) sig1 := make(chan Dzc,1) fmt.Println(<-sig1)
这样会输出两个空结构体{},消费者知道现在没数据,而且好歹也知道你也关门大吉了,等也等不到,所以就直接拿了个空值,就撤了,程序也不会一直退出不了。