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

报告相同问题?

悬赏问题

  • ¥15 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式
  • ¥50 potsgresql15备份问题
  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错