Go by Example: Channel Synchronization

Podemos usar canales para sincronizar la ejecución a través de goroutines. Aquí hay un ejemplo de cómo usar una recepción bloqueante para esperar a que una goroutine termine. Cuando esperas que varias goroutines terminen, puedes preferir usar un WaitGroup.

package main
import (
    "fmt"
    "time"
)

Esta es la función que ejecutaremos en una goroutine. El canal done se utilizará para notificar a otra goroutine que el trabajo de esta función ha terminado.

func worker(done chan bool) {
    fmt.Print("working...")
    time.Sleep(time.Second)
    fmt.Println("done")

Envía un valor para notificar que hemos terminado.

    done <- true
}
func main() {

Inicia una goroutine worker, dándole el canal para notificar.

    done := make(chan bool, 1)
    go worker(done)

Bloquea hasta que recibamos una notificación del worker en el canal.

    <-done
}
$ go run channel-synchronization.go      
working...done                  

Si quitas la línea <- done de este programa, el programa terminaría antes de que el worker incluso comenzara.

Siguiente ejemplo: Channel Directions.