Para os recém-chegados a Golang (como eu), a visão c <- <-chan
pode ser bastante confusa. Não é que os canais em si sejam confusos, mas o aparentemente duplicado <-
é enganoso. Então, dividi um pouco e é realmente simples. Veja este exemplo em uma função simples de ventilação de canal.
func fanIn(input1, input2 <-chan string) <-chan string {
c := make(chan string)
// This looks confusing, but is actually simple.
// This is easier to digest if we read from right to left.
// On the right hand side we have a channel (input1).
// When that channel gets data (<-input1), pass that data
// to the new channel (c <-). So at run time we essentially have
// c <- "my value"
go func() {
for {
c <- <-input1
}
}()
go func() {
for {
c <- <-input2
}
}()
return c
}
Leia mais sobre simultaneidade aqui- http://blog.golang.org/pipelines