2014-10-10 20 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