3 回答
TA贡献1993条经验 获得超5个赞
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 关注
- 185 浏览
添加回答
举报