2014-10-10 1 views
5

Sto cercando di scrivere funzione come questa, ma non posso dichiarare fetta di canalicome posso dichiarare una fetta di Chan (canali) in func

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

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

è possibile in Vai di avere un una fetta di canali come argomento?

esempio di chiamata

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

se posso fare questo

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

assumo che dovrebbe essere possibile avere fetta o array di "< stringa -chan"

aggiornato:

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

Si dovrebbe raramente restituire canali dalla propria API pubblica, invece di prendere un canale come argomento in cui si invia. Puoi usare questo singolo canale in tutte le tue chiamate noiose e non avrai nemmeno bisogno del fanIn. – Wessie

+0

È anche possibile utilizzare https://godoc.org/github.com/eapache/channels#Multiplex che utilizza un 'select' per evitare di generare un'intera goroutine per ogni canale di input. – Evan

risposta

4

ho fissato la sintassi nella funzione un po ', si compila ora:

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 per il bene di leggibilità, mi piacerebbe scrivere come:

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

EDIT: L'originale il codice aveva il problema di usare set[i] all'interno della goroutine, facendo in modo che tutti leggessero dall'ultimo canale. ecco una versione fissa:

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

fantastico! Molte grazie! Vedo una strana immagine. Quando provo a chiamare fanIn (set) ho ottenuto solo l'ultima chan come risultato. – qwertmax

+1

@qwertmax ovviamente, questo a causa di 'i', lascia che corregga la mia risposta per essere corretta anche in questo senso –

+0

@qwertmax vedi ora –