Press "Enter" to skip to content

go避免对已关闭的通道再次执行关闭操作

为了避免对已关闭通道再度执行关闭操作引发 panic,一般我们约定只能在发送方关闭通道,而在接收方,我们则通过通道接收操作返回的第二个参数是否为 false 判定通道是否已经关闭,如果已经关闭,则不再执行发送操作。

package main

import "fmt"

func main() {
	ch := make(chan int, 2)
	// 发送方
	go func() {
		for i := 0; i < 5; i++ {
			fmt.Printf("发送方:发送数据 %v\n", i)
			ch <- i
		}
		fmt.Println("数据发送完成,关闭通道")
		close(ch)
	}()

	// 接收方
	for {
		num, ok := <-ch
		if !ok {
			fmt.Println("接收方:通道已关闭")
			break
		}
		fmt.Println("接收方,拿到的数据为:", num)
	}

	fmt.Println("程序退出")
}
发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注