golang管道通道-作为一个单独的功能工作,但不';t作为主要功能的一部分工作

golang管道通道-作为一个单独的功能工作,但不';t作为主要功能的一部分工作,go,Go,我是新手,目前我正试图了解频道同步是如何工作的。我正在解决一项测试任务,该任务要求我从通道构建管道。我写了两个类似的解决方案,但其中一个由于未知原因(对我来说)不起作用 这不起作用(go例程直接从函数启动): 这是可行的(go例程从一个单独的函数开始): 我完全迷路了,我看不出有什么区别,也不明白为什么第一个例子不起作用。有人知道吗?您正在跨goroutine使用捕获变量fn,在该变量中,该变量将在迭代过程中被覆盖。所有goroutines看到的是funcs中的最新作业。将管道功能中的代码更

我是新手,目前我正试图了解频道同步是如何工作的。我正在解决一项测试任务,该任务要求我从通道构建管道。我写了两个类似的解决方案,但其中一个由于未知原因(对我来说)不起作用

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

这是可行的(go例程从一个单独的函数开始):


我完全迷路了,我看不出有什么区别,也不明白为什么第一个例子不起作用。有人知道吗?

您正在跨
goroutine
使用捕获变量
fn
,在该变量中,该变量将在迭代过程中被覆盖。所有
goroutines
看到的是
funcs
中的最新作业。将
管道
功能中的代码更改为以下内容:

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
}

这是戈朗最有名的一家酒店

您正在跨
goroutine
使用捕获变量
fn
,在该变量中,该变量将在迭代过程中被覆盖。所有
goroutines
看到的是
funcs
中的最新作业。将
管道
功能中的代码更改为以下内容:

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
}

这是戈朗最有名的一家酒店

你完全正确!我试图避免它与进出,但错过了与fn!非常感谢你,我因此无法入睡!:你完全正确!我试图避免它与进出,但错过了与fn!非常感谢你,我因此无法入睡!:D