【发布时间】:2018-10-02 22:01:57
【问题描述】:
我是新手,我正在尝试了解 goroutine 中通道的工作方式。据我了解,关键字range 可用于迭代通道的值,直到通道关闭或缓冲区用完为止;因此,for range c 将重复循环,直到缓冲区用完。
我有以下简单的函数可以为频道增加价值:
func main() {
c := make(chan int)
go printchannel(c)
for i:=0; i<10 ; i++ {
c <- i
}
}
我有两个printchannel 的实现,但我不确定为什么行为不同。
实施 1:
func printchannel(c chan int) {
for range c {
fmt.Println(<-c)
}
}
输出:1 3 5 7
实施 2:
func printchannel(c chan int) {
for i:=range c {
fmt.Println(i)
}
}
输出:0 1 2 3 4 5 6 7 8
我没想到这些输出!
想要的输出:0 1 2 3 4 5 6 7 8 9
main 函数和printchannel 函数是否应该在两个线程上并行运行,一个向通道添加值,另一个读取值直到通道关闭?我可能在这里遗漏了一些基本的 go/thread 概念,并且指向它的指针会有所帮助。
非常感谢对此的反馈(以及我对 goroutine 中通道操作的理解)!
【问题讨论】:
-
range范围直到通道关闭。 “缓冲区用完”与范围的工作方式无关(无论缓冲区用完意味着什么)。 -
我还找到了另一个解决方案,即使用
defer。最终我可以在打印内容之前go func() { defer close(ch) }
标签: multithreading go range goroutine channels