我是新手,目前我正试图了解频道同步的工作原理。我正在解决一个需要我从频道构建管道的测试任务。我写了两个类似的解决方案,但其中一个解决方案的原因并不明确(对我来说)。
这不起作用(go-routines直接从函数启动):
https://play.golang.org/p/EHceKjZZ-G
这是有效的(go-routines是从一个单独的函数启动的):
https://play.golang.org/p/QysTAVxbVc
我完全迷失了,我没有看到差异,也无法理解为什么第一个例子不起作用。有人有任何想法吗?
答案 0 :(得分:3)
您在fn
上使用捕获变量goroutine
,其中变量将在迭代期间被覆盖。所有goroutines
看到的是funcs
中的最新工作。将Pipe
函数中的代码更改为以下内容:
for _, fn := range funcs {
out = make(chan interface{})
wg.Add(1)
go func(f job, inx, outx chan interface{}) {
f(inx, outx)
close(outx)
wg.Done()
}(fn, in, out)
in = out
}
这是golang中的common mistake之一。