dtxw20878 2014-10-10 09:55
浏览 84
已采纳

我如何在func中声明chan的切片

I'm trying to write function like this, but I can't declare slice of channels

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

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

is it possible in Go to have a slice of channels as argument?

example of call

set := [2]chan string{mylib.Boring("Joe"), mylib.Boring("Ann")}
c := fanIn(set)

if I can do this

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

I assume that it should be possible to have slice or array of "<-chan string"

updated:

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条回答 默认 最新

  • duangongqiong6958 2014-10-10 10:39
    关注

    I fixed the syntax in your function a bit, it compiles now:

    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
    }
    

    BTW for the sake of readability, I'd write it as:

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

    EDIT: Your original code had the problem of using set[i] inside the goroutine, causing them all to read from the last channel. here's a fixed version:

    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
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 京东qq代付链接怎么提取?
  • ¥20 两个不同Subnet的点对点连接
  • ¥50 怎么判断同步时序逻辑电路和异步时序逻辑电路
  • ¥15 差动电流二次谐波的含量Matlab计算
  • ¥15 Can/caned 总线错误问题,错误显示控制器要发1,结果总线检测到0
  • ¥15 C#如何调用串口数据
  • ¥15 MATLAB与单片机串口通信
  • ¥15 L76k模块的GPS的使用
  • ¥15 请帮我看一看数电项目如何设计
  • ¥23 (标签-bug|关键词-密码错误加密)