2014-10-10 74 views
5

我想写这样的函数声明CHAN(通道)的片,但我不能申报渠道的片我怎么能在FUNC

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

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

是否有可能在进入有一小部分渠道作为参数?

呼叫

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

的例子,如果我能做到这一点

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

我认为它应该是可能有 “< -chan字符串”

的片或阵列已更新:

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

你应该很少从你的公共API返回频道,而是把一个频道作为你发送的参数。您可以在所有Boring调用中使用此单个频道,甚至不需要fanIn。 – Wessie 2014-10-10 13:19:51

+0

你也可以使用https://godoc.org/github.com/eapache/channels#Multiplex,它使用'select'来避免产生每个输入通道的整个goroutine。 – Evan 2014-10-10 14:56:01

回答

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 
} 

BTW为可读性起见,我会写为:

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 2014-10-10 10:48:30

+1

@qwertmax当然,这是因为'我',让我在这个意义上解决我的答案是正确的 – 2014-10-10 10:51:11

+0

@qwertmax现在看到 – 2014-10-10 10:54:53