Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpChDn 165 of 280 menu
◀ ▶

Сигнал конца работы в Go

Для сообщения «работа закончена» часто заводят канал пустой структуры: в нем нет байтов данных, важен сам факт события. Получатель ждет одно сигнальное значение или конец канала после завершения отправителем.

Воркер печатает строку, затем шлет пустую структуру; main ждет этот знак перед финальной печатью:

package main import "fmt" func worker(done chan struct{}) { fmt.Println("work") done <- struct{}{} } func main() { done := make(chan struct{}) go worker(done) <-done fmt.Println("all finished") }

Сначала "work", затем "all finished". Прием из done блокировал main, пока воркер не отправил сигнал.

Тот же смысл через завершение канала без отдельной отправки: отправитель один раз закрывает связь, получатель читает и выходит:

package main import "fmt" func worker(done chan struct{}) { fmt.Println("step") close(done) } func main() { done := make(chan struct{}) go worker(done) <-done fmt.Println("exit") }

Дан следующий код:

done := make(chan struct{}) go func() { fmt.Println("run") }()

Допишите в ветке отправку пустой структуры в done и в main дождитесь сигнала перед печатью "stop".

Скажите, зачем для сигнала берут тип пустой структуры, а не, например, булево значение в канале.

Скажите, чем отличается ожидание одного приема из done от ожидания счетчика группы для одной ветки.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить