2014-10-10 5 views
5

Ich versuche Funktion wie diese zu schreiben, aber ich kann nicht Scheibe Kanäle erklärenwie kann ich ein Stück chan (Kanäle) in func erklären

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

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

ist es möglich, in Go a zu haben Slice von Kanälen als Argument?

Beispiel Aufruf

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

, wenn ich diese

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

Ich gehe davon aus tun kann, dass es möglich sein sollte, von "< -chan string"

Scheibe oder Array haben aktualisiert:

+0

Sie sollten selten Kanäle von Ihrer öffentlichen API zurückgeben, stattdessen nehmen Sie einen Kanal als Argument, das Sie senden. Sie können diesen einen Kanal in allen Ihren Boring-Anrufen verwenden und brauchen nicht einmal das fanIn. – Wessie

+0

Sie könnten auch https://godoc.org/github.com/eapache/channels#Multiplex verwenden, das ein 'select' verwendet, um zu vermeiden, dass für jeden Eingabekanal eine ganze Goroutine erzeugt wird. – Evan

Antwort

4

fixiert ich die Syntax in Ihrer Funktion ein wenig, es kompiliert jetzt:

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 aus Gründen der Lesbarkeit, würde ich schreibe es als:

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

EDIT: Ihr Original Code hatte das Problem, set[i] in der Goroutine zu verwenden, was sie alle vom letzten Kanal lesen lassen. Hier ist eine feste 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 
} 
+1

großartig! Danke vielmals! Ich sehe ein seltsames Bild. Wenn ich versuche fanIn (set) anzurufen, bekomme ich nur den letzten chan als Ergebnis. – qwertmax

+1

@qwertmax natürlich, das ist wegen 'i', lassen Sie mich meine Antwort korrigieren in diesem Sinne auch –

+0

@qwertmax siehe jetzt –

Verwandte Themen