如何在函数中声明一个 chan(通道)的切片?

5
我正在尝试编写这样的函数,但我无法声明通道片段。
func fanIn(set <-[]chan string) <-chan string {
    c := make(chan string)

    for i := range set {
        go func() { for {c <-set[i]} }()
    }
    return c
}

在Go中,是否可以将一个通道的切片作为参数传递?
调用示例:
set := [2]chan string{mylib.Boring("Joe"), mylib.Boring("Ann")}
c := fanIn(set)

如果我能做到这一点

func fanIn(input1, input2 <-chan string) <-chan string {

我认为可以创建一个"<-chan string"的切片或数组。
更新:
func fanIn(set []<-chan string) <-chan string {
    c := make(chan string)

    for i := range set {
        go func() {
            for {
                x := <-set[i]
                c <- x
            }
        }()
    }

    return c
}

func main() {
    set := []<-chan string{mylib.Boring("Joe"), mylib.Boring("Ann"), mylib.Boring("Max")}
    c := fanIn(set)
    for i := 0; i < 10; i++ {
        fmt.Println(<-c)
    }
    fmt.Println("You're boring: I'm leaving.")
}

你的公共API中很少返回通道,而是将通道作为参数发送。您可以在所有Boring调用中使用此单个通道,甚至不需要fanIn。 - Wessie
你也可以使用 https://godoc.org/github.com/eapache/channels#Multiplex,它使用 select 来避免为每个输入通道生成整个 goroutine。 - Evan
1个回答

4

我稍微修正了你的函数语法,现在它可以编译了:

func fanIn(set []<-chan string) <-chan string {
    c := make(chan string)


    for i := range set {
        // here is the main change - you receive from one channel and send to one.
        // the way you wrote it, you're sending the channel itself to the other channel
        go func() { for {c <- <- set[i]} }()
    }
    return c
}

顺便提一下,为了易读性,我会这样写:

    go func() {
        for {
            x := <-set[i]
            c <- x
        }
    }()

编辑:您原始的代码存在问题,即在goroutine内使用了set[i],导致它们全部从最后一个通道中读取。这里是修复后的版本:

func fanIn(set []<-chan string) <-chan string {
    c := make(chan string)

    for i := range set {
        go func(in <-chan string) {
            for {
                x := <- in
                c <- x
            }
        }(set[i])
    }
    return c
}

1
非常好!非常感谢!我看到了一张奇怪的图片。当我尝试调用fanIn(set)时,我只得到了最后一个通道作为结果。 - qwertmax
1
@qwertmax 当然,那是因为 i 的缘故,让我修正我的答案以在这个意义上正确。 - Not_a_Golfer
1
啊,我也搞砸了。谢谢你。现在它运行得很完美。你是最棒的。 - qwertmax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接