channel使用法则

本文详细解析了Go语言中Channel的三种操作方式(Read、Write、Close)及四种状态(nil、打开且非空、打开且空、关闭的),并介绍了不同操作对各状态的影响,以及如何避免panic的发生。通过示例代码展示了正确的Channel使用方式。

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

Channel操作方式和状态

channel只有三种操作方式

  1. Read
  2. Write
  3. Close

有4种状态

  1. nil
  2. 打开且非空
  3. 打开且空
  4. 关闭的

有三种类型

  1. 只写
  2. 只读
  3. 可读可写

不同的操作对不同状态的channel产生的影响

操作方式Channel状态结果
Readnil阻塞
Read打开且非空输出值
Read打开且空阻塞
Read关闭的 false
Read只写编译错误
Writenil阻塞
Write打开的但填满的阻塞
Write打开且但为填满的写入值
Write关闭的panic
Write只读编译错误
Closenilpanic
Close打开且非空关闭channel,读取成功直到通道耗尽,然后读取默认值
Close打开且空关闭channel,督导生产者的默认任职
Close关闭的panic
Close只读编译错误

怎样避免panic

编译错误我们通过编译器就可以防止了,但是我们怎么能避免panic呢。我们已经知道了panic的出现时机,避免出现这种情况就可以了
panic的三种情况

  1. 写入关闭的channel
  2. 关闭关闭的channel
  3. 关闭为nil的channel

首先我们将channel分为两组,

  1. channel的生成者
    1. 实例化channel
    2. 执行写操作
    3. 关闭channel
    4. 执行以上3点,并通过只读channel将他们暴露出去
  2. channel的消费者
    1. 要知道channel是否关闭了
    2. 正确处理阻塞

示例

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)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值