Синхронизация канала (Channel Synchronization)|Channel Synchronization
#
// Мы можем использовать каналы для синхронизации
// выполнения между горутинами. Вот пример
// использования блокирующего получения для ожидания
// завершения работы горутины. При ожидании завершения
// нескольких процедур вы можете использовать [WaitGroup](waitgroups).
package main
import (
"fmt"
"time"
)
// Эту функцию мы будем запускать в горутине. Канал
// `done` будет использован для оповещения другой
// горутины о том, что функция выполнена успешно.
func worker(done chan bool) {
fmt.Print("working...")
time.Sleep(time.Second)
fmt.Println("done")
// Отправить значение, чтобы сказать что функция
// выполнена успешно.
done <- true
}
func main() {
// Запустите воркера в горутине и передайте ему канал
// для оповещения.
done := make(chan bool, 1)
go worker(done)
// Блокируйте, пока мы не получим уведомление от
// воркера из канала.
<-done
}
$ go run channel-synchronization.go
working...done
# Если вы удалите строку `<- done` из этой программы,
# программа закроется до того, как `воркер` даже
# запустится.