3 回答
TA贡献1993条经验 获得超6个赞
out := make(chan int)
这不是缓冲通道,这意味着out <- n将阻塞,直到有人在某处读取该通道(fmt.Println(<-c)调用)
(另请参阅“ do golang 通道维护顺序”)
所以gen()函数末尾的返回并不意味着文字go func()被终止(因为它仍在等待读者消费out频道的内容)。
但是
main函数获取out通道作为gen()函数的返回。终止
后如何获得它gen()?
gen()终止的事实对其返回值(out通道)没有影响:“ gen()”的目标是“生成”该out通道。
main可以在终止后很长时间使用out(作为 的返回值gen())gen()。
字面go func内gen()仍然运行,即使gen()被终止。
TA贡献1848条经验 获得超2个赞
因为gen()将通道填充函数作为 goroutine 触发;
go func() {
for _, n := range nums {
out <- n
}
close(out)
}()
并且当第一个值在out通道上发送时它会阻塞,因为还没有接收任何东西(无缓冲的通道在发送时阻塞,直到有东西在它们上接收),当gen()函数返回时,goroutine不会结束。
从收到c的main()
fmt.Println(<-c)
...
然后导致 goroutine 在gen()读取结果时继续填充通道,然后main()在 goroutine 返回时最终返回,因为没有什么可以发送了out,也没有什么可以接收了c。
此外,c := make(<-chan int)inmain()是不必要的,因为gen()创建了一个频道并返回它。
见游乐场
- 3 回答
- 0 关注
- 222 浏览
添加回答
举报
