Channels
#
// _Channels_ ou _canais_ são conexões entre goroutines
// concorrentes. Valores podem ser enviados para canais
// de uma goroutine de forma que outra goroutine os receba.
package main
import "fmt"
func main() {
// Criação de canais pode ser feito com `make(chan val-type)`.
// Canais são tipados pelo valores que eles recebem.
messages := make(chan string)
// Para _Enviar_ um valor para um canal, use a sintaxe
// `channel <-`. Aqui é enviada, de dentro de uma nova
// goroutine uma string `"ping"` para o canal `messages`
// feito acima.
go func() { messages <- "ping" }()
// A sintaxe `<-channel` _recebe_ um valor de um canal.
// Aqui é recebido a string `"ping"` pelo canal message,
// e após, impresso.
msg := <-messages
fmt.Println(msg)
}
# Ao rodar o programa a mensagem `"ping"` é passada com
# successo de uma goroutine para outra via o canal que
# foi criado.
$ go run channels.go
ping
# Por padrão, ambos os canais de envio e recebimento
# ficam bloqueados até que ambos estejam prontos.
# Esta propriedade permite aguardar ao final do programa
# pela mensagem sem que seja preciso qualquer outro tipo
# de sincronização.