Golang: Language: Concurrency: Close Channel

 10th November 2022 at 3:04pm

关闭一个 channel 的方式:

close(ch)

如果向一个已经关闭的 channel 发送数据,会导致 panic。这意味着,只有发送数据的一方应该控制 channel 的关闭(接收的一方不应该关闭 channel,因为并不知道对方还要不要发送)。

没有不消费 channel 便知道它是否被关闭的方式。

对于一个关闭的 channel:

v := <- ch     // v 为 nil
v, ok := <-ch  // v 为 nil,ok 为 false

for v := range ch {
    fmt.Println(v)  // 这行永远不会被执行
}

select 语句中有一个 case 是从一个关闭的 channel 中接收消息时,该 case 总是 ready 的:

func main() {
	ch := make(chan struct{})
	close(ch)

	select {
	case <-ch:
		fmt.Println("closed")
	default:
		fmt.Println("default")
	}

	select {
	case <-ch:
		fmt.Println("closed")
	default:
		fmt.Println("default")
	}
}

上述代码输出两次 "closed"。