golang pipelining渠道 - 作为一个单独的功能,但不作为主要功能的一部分

时间:2017-06-03 07:44:57

标签: go

我是新手,目前我正试图了解频道同步的工作原理。我正在解决一个需要我从频道构建管道的测试任务。我写了两个类似的解决方案,但其中一个解决方案的原因并不明确(对我来说)。

这不起作用(go-routines直接从函数启动):

https://play.golang.org/p/EHceKjZZ-G

这是有效的(go-routines是从一个单独的函数启动的):

https://play.golang.org/p/QysTAVxbVc

我完全迷失了,我没有看到差异,也无法理解为什么第一个例子不起作用。有人有任何想法吗?

1 个答案:

答案 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之一。