通过range取通道内数据的疑问
来源:13-7 通过for range遍历channel和close关闭channel

evilchaos
2021-06-28
对于通道内的数据,我放入一个数后,协程里面通过range取完数后,range方法就应该是结束执行了啊,为啥再放一个数他还能继续在range逻辑内打印出来?
写回答
2回答
-
bobby
2021-06-30
package main import ( "fmt" "sync" "time" ) var wg sync.WaitGroup func consumer(queue chan int){ defer wg.Done() for { data, ok := <- queue if !ok { break } fmt.Println(data) time.Sleep(time.Second) } } func main() { /* channel提供了一种通信机制,定向,python java消息队列 */ //1. 定义一个channel var msg chan int //2. 初始化这个channel, 两种方式: //msg = make(chan int) //第一种方式: 无缓冲 msg = make(chan int, 1) //第二种初始化方式: 有缓冲空间 //3. 在go语言中 使用make初始化的有三种, 1. slice 2. map 3. channel msg <- 1 //将1放入到channel中 wg.Add(1) go consumer(msg) msg <- 2 //关闭channel, 1. 已经关闭的channel不能再发送数据, 2. 已经关闭的channle消费者能继续取数据吗? //已经关闭的channel 能够继续取数据, 知道数据取完为止 close(msg) wg.Wait() }
00 -
bobby
2021-06-29
你贴一下代码我看看
012021-06-29
相似问题