如何在func中声明一片chan(通道)

时间:2014-10-10 09:55:50

标签: go slice channel

我试图编写这样的函数,但我无法声明切片通道

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 {

我认为应该可以使用&#34;&lt; -chan string&#34;

的切片或数组

更新

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.")
}

1 个答案:

答案 0 :(得分: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
}