在golang中,merge函数包含在哪个包中?

huangapple go评论96阅读模式
英文:

Which package contains merge function in golang

问题

我正在尝试在迭代中合并两个通道,以便可以在每个步骤中检索两个通道的值。
我写了以下代码:

ch1, ch2 := make(chan int), make(chan int)
go Walk(t1, ch1)
go Walk(t2, ch2)

for ints := range merge(ch1, ch2) {
    fmt.Println(ints)
}

但是当我运行它时,我得到了"prog.go:31: undefined: merge"的错误。
我想知道这个merge函数在哪里。

英文:

I am trying to merge 2 channels in an iteration so that I can retrieve both channels values for each step.
I wrote the following lines

ch1, ch2 := make(chan int), make(chan int)
go Walk(t1, ch1)
go Walk(t2, ch2)

for ints := range merge(ch1, ch2) {
    fmt.Println(ints)
}

but when I run it, I get "prog.go:31: undefined: merge".
I would like to know where this merge function is located.

答案1

得分: 13

标准库中没有这样的函数,你需要自己定义它。

从你的代码来看,似乎你已经阅读了这篇文章,其中已经给出了一个名为merge的用户定义函数的示例:

func merge(cs ...<-chan int) <-chan int {
    var wg sync.WaitGroup
    out := make(chan int)

    // 为每个输入通道启动一个输出 goroutine。output 从 c 复制值到 out,直到 c 关闭,然后调用 wg.Done。
    output := func(c <-chan int) {
        for n := range c {
            out <- n
        }
        wg.Done()
    }
    wg.Add(len(cs))
    for _, c := range cs {
        go output(c)
    }

    // 启动一个 goroutine,在所有输出 goroutine 完成后关闭 out。这必须在 wg.Add 调用之后启动。
    go func() {
        wg.Wait()
        close(out)
    }()
    return out
}

来源:http://blog.golang.org/pipelines

英文:

There isn't such a function in the standard library, you'll have to define it yourself.

From your code, it seems that you've read this post which already gives an example of merge, a user-defined function:

func merge(cs ...&lt;-chan int) &lt;-chan int {
    var wg sync.WaitGroup
    out := make(chan int)

    // Start an output goroutine for each input channel in cs.  output
    // copies values from c to out until c is closed, then calls wg.Done.
    output := func(c &lt;-chan int) {
        for n := range c {
            out &lt;- n
        }
        wg.Done()
    }
    wg.Add(len(cs))
    for _, c := range cs {
        go output(c)
    }

    // Start a goroutine to close out once all the output goroutines are
    // done.  This must start after the wg.Add call.
    go func() {
        wg.Wait()
        close(out)
    }()
    return out
}

source: http://blog.golang.org/pipelines

huangapple
  • 本文由 发表于 2014年11月17日 19:59:29
  • 转载请务必保留本文链接:https://go.coder-hub.com/26972253.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定