golang二三事之关于channel你知道和不知道的那些事

本文深入探讨了Golang中channel的使用,包括向关闭的channel写入数据会导致panic,以及不同类型的channel在读取关闭channel时的行为。强调了关闭channel的原则,应当由最后一个生产者协程关闭以通知消费者,并指出在有多个并行生产者时关闭channel的风险。同时,提到了在特定情况下,发送完数据的channel不一定需要立即关闭。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

channel

  1. 向一个关闭的channel里,写数据
    无论是否带缓存的channel,都会引发错误

panic: send on closed channel

  1. 向一个关闭的channel里,读数据。

    1. 带缓存的channel

      缓存里还有数据
      返回 数据, true

      缓存里没有数据
      返回 数据类型未初始化零值, false

    2. 不带缓存的channel

      缓存里没有数据
      返回 数据类型未初始化零值, false

      缓存里有数据
      执行不到 从缓存里读数据就报错。因为数据没人读就阻塞在哪里了

  2. 关闭一个已经关闭的channel
    会报错,提示不能关闭一个已经报错的channel

  3. 只有channel的发送方可以关闭channel,接收方不能关

  4. 需要及时关闭channel的场景(必须close)
    当对于一个channel进行for range 循环时,如果发送方发完数据后不及时关闭channel,则会引起接受方的报错

  5. 发送完数据的channel是否要立即close
    不需要,比如广播模式下当最后一条数据发送完成后,也许还有接受者没有接收完数据

  6. Channel关闭原则

不要在消费端关闭channel,不要在有多个并行的生产者时对channel执行关闭操作。 也就是说应该只在[唯一的或者最后唯一剩下]的生产者协程中关闭channel,来通知消费者已经没有值可以继续读了。只要坚持这个原则,就可以确保向一个已经关闭的channel发送数据的情况不可能发生。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值