Go por Exemplo: Canais

Canais são pipes que conectam goroutines concorrentes. Você pode enviar valores para os canais de uma goroutine e receber esses valores em outra goroutine. Canais são um poderoso primitivo que são muito subjacentes à funcionalidade do Go.

package main
import "fmt"
func main() {

Cria um novo canal com make(chan tipo-val). Canais são digitados pelos valores que eles transmitem.

    mensagens := make(chan string)

Envia um valor para um canal usando a sintaxe canal <-. Aqui enviamos "ping" para o canal mensagens que fizemos acima, a partir de uma nova goroutine.

    go func() { mensagens <- "ping" }()

A sintaxe <-canal recebe um valor de um canal. Aqui nós vamos receber a mensagem "ping" que enviamos acima e imprimi-lo.

    msg := <-mensagens
    fmt.Println(msg)
}

Quando nós executarmos o programa a mensagem "ping" é passada com sucesso de uma goroutine para outra através de nosso canal.

$ go run canais.go
ping

Por padrão envia e recebe blocos até que o emissor e receptor estejam prontos. Essa propriedade nos permitiu esperar até o final de nosso programa pela mensagem "ping" sem ter que usar qualquer outra sincronização.

Próximo exemplo: Buferização de Canal.