并不是往通道里放多少次数据,就必须取多次少数据的(之前的例子都是放3次取3次,放10次取10次),我们可以做一个操作,当子协程没有新放入的时候,主协程不再去取,这就是关闭通道
package main import "fmt" //channel并不像文件那样需要经常去关闭它,只有当你确实没有任何发送数据了,或者是你想显示的结束range循环之类的,才去关闭channel //关闭channel后,无法向channel再发送数据(引发panic错误后导致接收立即返回零值) //关闭channel后,可以继续向channel接收数据 //对于nil channel,无论收发都会被阻塞 func main() { ch := make(chan int) go func() { for i:=0; i<5; i++ { ch <- i } close(ch) //关闭channel }() for true { //如果OK为true,则说明通道没有关闭 if num, ok := <-ch; ok==true{ fmt.Println("num = ", num) }else { break } } //上面的这段死循环也可以使用下面的实现,更简便
for num := range ch { fmt.Printf("num = ", num) }
}
执行结果
num = 0 num = 1 num = 2 num = 3 num = 4
原文地址:https://www.cnblogs.com/baylorqu/p/9674599.html
时间: 2024-11-10 15:05:32