作者:手机用户2502916831 | 来源:互联网 | 2023-10-12 08:14
源码分析https:mp.weixin.qq.comseCwZMwGjU2yoXu6K2nGF3g 1当chan用close关闭时,无论是有缓存的还是无缓存的,返回已缓冲数据或零值
源码分析https://mp.weixin.qq.com/s/eCwZMwGjU2yoXu6K2nGF3g
1 当chan用close关闭时,无论是有缓存的还是无缓存的,返回已缓冲数据或零值,如果重复用close关闭chan或对关闭的chan写入值都会报错,
https://blog.csdn.net/qq_41065919/article/details/107729571
https://www.cnblogs.com/pluse/p/12167537.html
struct{}类型好像只有一种具体实例即struct{}{},chan中如果有这种类型,只能写入它的零值struct{}{},所以类型为struct{}的chan无论是写入还是读出都时零值,
func main() {
m := make(chan struct{}, 1)
// 从空的m中一直读取值会一直阻塞,所以会报死锁的错误,all goroutines are asleep - deadlock!
//b := <- m
//fmt.Println(b)
// 如果这里就关闭了协程,下面会直接输出chan中的零值,而不会走default,
//close(m)
//m <- struct{}{}
go func() {
for{
select {
case a := <- m:
fmt.Println(a)
time.Sleep(time.Second)
default:
fmt.Println("chan为空,读取的时候会阻塞")
time.Sleep(time.Second)
}
}
}()
// 加这个是为了主协程等待里面的子协程,否则的话主协程直接执行完了,观察不到子协程的具体输出,
time.Sleep(time.Second * 5)
}
View Code