Go podle Příkladů: Kanály a synchronizace

Kanály můžeme použít pro synchronizaci provádění mezi gorutinami. Zde je příklad který s použitím blokujícího příjmu čeká až gorutina skončí. Až budete čekat na ukončení několika gorutin, možná budete preferovat použití WaitGroup.

package main
import (
    "fmt"
    "time"
)

Tohle je funkce která bude čekat na gorutinu. Kanál done bude použitý k oznámení druhé gorutině že práce této funkce je hotova.

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

Pošle hodnotu abysme oznámili že jsme hotovi.

    done <- true
}
func main() {

Nastartuje pracovní gorutinu a předá ji kanál pro oznámení.

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

Bude blokovat provádění dokud nedostaneme do kanálu oznámení od pracovní rutiny.

    <-done
}
$ go run channel-synchronization.go      
pracuji...hotovo                

Když byste odstranili řádek <- done, program by mohl skončit dřív, než pracovní gorutina dokončí svou práci, a v některých případech dokonce ještě dřív, než by vůbec nastartovala.

Další příklad: Kanály se směrem.