为了避免对已关闭通道再度执行关闭操作引发 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("程序退出")
}