Go por Exemplo: Sincronização de Canal

Nós podemos usar canais para sincronizar a execução através das goroutines. Aqui temos um exemplo do uso de um bloqueador de recebimento para esperar pela finalização de uma goroutine.

package main
import "fmt"
import "time"

Essa é a função que iremos executar em uma goroutine. O canal feito será usado para notificar outra goroutine que essa função trabalhador é feita.

func trabalhador(feito chan bool) {
    fmt.Print("trabalhando...")
    time.Sleep(time.Second)
    fmt.Println("feito")

Envia um valor para notificar o que estamos fazendo.

    feito <- true
}
func main() {

Inicia a goroutine trabalhador, dando-lhe um canal para notificar.

    feito := make(chan bool, 1)
    go trabalhador(feito)

Bloqueia até que recebamos uma notificação de um trabalhador no canal.

    <-feito
}
$ go run sincronização-canal.go
trabalhando...feito                  

Se você removeu a linha <- feito desse programa, o programa deveria sair antes do trabalhador ser iniciado.

Próximo exemplo: Direções do Canal.