Можем да ползваме канали, за да съгласуваме1
изпълнението на различни гозадачи. Тук имаме пример с
получаване на данни, което спира изпълнението на цялата
програма, изчаквайки я да приключи.2
Когато изчаквате множество гозадачи да приключат, може
да предпочетете да използвате можествено изчакване. То
е осъществено чрез структурата
WaitGroup в пакета sync.
import (
"fmt"
"time"
)
Това е функцията, която ще изпълним в гозадача. Канала
готово ще използваме, за да уведомим друга
гозадача (програмата ни), че тази функция е приключила.
func работник(готово chan bool) {
fmt.Print("работя...")
time.Sleep(time.Second)
fmt.Println("готово")
Изпращаме стойност като съобщение, че сме готови.
готово <- true
}
func main() {
Пускаме гозадачата работник и ѝ подаваме канала,
по който да изпрати съобщението.
готово := make(chan bool, 1)
go работник(готово)
Изпълнението спира и чака, докато получи съобщение от работника по канала.
<-готово
}
$ go run channel-synchronization.go
работя...готово
Ако премахнете реда с <-готово, програмата
най-вероятно ще приключи преди работника да свърши
работа и може би преди да е започнал.
Следващ пример: Посока на канал.