Go Em Exemplos: 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.

Próximo exemplo: Channel Buffering.