概述
Channel操作方式和状态
channel只有三种操作方式
- Read
- Write
- Close
有4种状态
- nil
- 打开且非空
- 打开且空
- 关闭的
有三种类型
- 只写
- 只读
- 可读可写
不同的操作对不同状态的channel产生的影响
操作方式 | Channel状态 | 结果 |
---|---|---|
Read | nil | 阻塞 |
Read | 打开且非空 | 输出值 |
Read | 打开且空 | 阻塞 |
Read | 关闭的 | false |
Read | 只写 | 编译错误 |
Write | nil | 阻塞 |
Write | 打开的但填满的 | 阻塞 |
Write | 打开且但为填满的 | 写入值 |
Write | 关闭的 | panic |
Write | 只读 | 编译错误 |
Close | nil | panic |
Close | 打开且非空 | 关闭channel,读取成功直到通道耗尽,然后读取默认值 |
Close | 打开且空 | 关闭channel,督导生产者的默认任职 |
Close | 关闭的 | panic |
Close | 只读 | 编译错误 |
怎样避免panic
编译错误我们通过编译器就可以防止了,但是我们怎么能避免panic呢。我们已经知道了panic的出现时机,避免出现这种情况就可以了
panic的三种情况
- 写入关闭的channel
- 关闭关闭的channel
- 关闭为nil的channel
首先我们将channel分为两组,
- channel的生成者
- 实例化channel
- 执行写操作
- 关闭channel
- 执行以上3点,并通过只读channel将他们暴露出去
- channel的消费者
- 要知道channel是否关闭了
- 正确处理阻塞
示例
package main
import "fmt"
func main() {
// channel 拥有者
chOwner := func() <-chan interface{} {
// 实例化channel
ch := make(chan interface{})
go func() {
// 写入完成后,关闭channel
defer close(ch)
for i := 0; i < 10; i++ {
// 拥有者负责写入
ch <- i
}
}()
// 将只读channel 返回
return ch
}
chCon := func(ch <-chan interface{}) {
// 只需要知道channel何时被关闭的即可
for i := range ch {
fmt.Println(i)
}
}
ch := chOwner()
chCon(ch)
}
最后
以上就是体贴树叶为你收集整理的channel使用法则的全部内容,希望文章能够帮你解决channel使用法则所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复