Go за Прикладом: Синхронізація каналу

Work in Progress / Сайт в процесі розробки

Основне застосування каналів - синхронізація між горутинами. Cкористаємось властивістю каналів до блокування, щоб зачекати завершення роботи горутини

package main
import "fmt"
import "time"

Ця функція буде запущена в горутині. Канал done буде використано для надсилання повідомлення головній горутині про завершення роботи поточного функціоналу.

func worker(done chan bool) {
    fmt.Print("працюємо...")
    time.Sleep(time.Second)
    fmt.Println("готово")

Надсилаємо повідомлення про завершення роботи.

    done <- true
}
func main() {

Створємо канала done і запускаємо горутину worker, виділивши їй канал для комунікації.

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

Чекаємо повідомлення про завершення роботи worker‘a, з каналу до якого ми передали повідомлення.

    <-done
}

Якщо ви приберете <- done з коду, то програма завершиться, ще до того як worker буде запущено.

$ go run channel-synchronization.go
працюємо...готово

Наступний приклад: Напрямки каналу.