对已经关闭的 channel 进行读写关闭操作会发生什么?

1、关闭已经关闭的 channel 会引发 panic,panic: close of closed channel

ch3 := make(chan int, 3)
wg.Add(1)
go func() {
	for i := 1; i < 3; i++ {
		ch3 <- i
	}
	close(ch3)
	close(ch3)
	// panic: close of closed channel
	wg.Done()
}()
wg.Wait()

2、对已关闭的 channel 进行写会引发 panic,panic: send on closed channel

ch4 := make(chan int, 5)
wg.Add(1)
go func() {
	for i := 1; i < 5; i++ {
		ch4 <- i
	}
	close(ch4)
	ch4 <- 5
	// panic: send on closed channel
	wg.Done()
}()
wg.Wait()

3、 对已关闭的 channel 进行读:

  1. 无缓冲的 channel,获得零值
ch2 := make(chan int)
go func() {
	ch2 <- 1
	close(ch2)
}()

for i := 0; i < 3; i++ {
	v, ok := <-ch2
	fmt.Println(i, v, ok)
}
  1. 有缓冲的 channel
  • 如果数据尚未读完,则获取数据
  • 如果数据处理完,则获取 0 值

怎么区分是缓存中的 0 值,还是因为关闭后返回的 0 值

通过 value, ok := ←chan
如果 ok 为 true 的时候就是缓存中的 0 值
否则是因为关闭后返回的 0 值

ch1 := make(chan int, 3)
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
	for i := 1; i < 3; i++ {
		ch1 <- i
	}
	close(ch1)
	wg.Done()
}()

wg.Wait()
for i := 1; i < 5; i++ {
	v, ok := <- ch1
	fmt.Println(i, v, ok)
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值