Daily Study
更新: 8/7/2025 字数: 0 字 时长: 0 分钟
Daily Plan
#todo
- [ ]
Go 的 Channel 应用
今天又复习了一下Go语言圣经
https://golang-china.github.io/gopl-zh/ch8/ch8-04.html
注意到了几点细节:
- 这里每个消息都有一个值,但是有时候通讯的事实和发生的时刻也同样重要。当我们更希望强调通讯发生的时刻时,我们将它称为消息事件,比如传递一个
done
消息,可以定义
go
done := make(chan struct{}) //or
done := make(chan int)
//功能代码
done <- struct{}{} // or
done <- 1
//最终返回done消息
<- done
- 你并不需要关闭每一个channel。只有当需要告诉接收者goroutine,所有的数据已经全部发送时才需要关闭channel。不管一个channel是否被关闭,当它没有被引用时将会被Go语言的垃圾自动回收器回收。(不要将关闭一个打开文件的操作和关闭一个channel操作混淆。对于每个打开的文件,都需要在不使用的时候调用对应的Close方法来关闭文件。)
- 当一个双向的
channel
接受或者发送到一个单向的channel
时,会做隐式转换为相应的单向类型 - 将一个带缓存的channel当作同一个goroutine中的队列使用,虽然语法看似简单,但实际上这是一个错误。Channel和goroutine的调度器机制是紧密相连的,如果没有其他goroutine从channel接收,发送者——或许是整个程序——将会面临永远阻塞的风险。