Go в примери: Съгласуване чрез канал

Можем да ползваме канали, за да съгласуваме1 изпълнението на различни гозадачи. Тук имаме пример с получаване на данни, което спира изпълнението на цялата програма, изчаквайки я да приключи.2 Когато изчаквате множество гозадачи да приключат, може да предпочетете да използвате можествено изчакване. То е осъществено чрез структурата WaitGroup в пакета sync.


  1. synchronization – съгласуване
  2. blocking receive – спъващо (блокиращо) получаване. Такова получаване на данни, което спира изпълнението на главната нишка/гозадача на програмата.
package main
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
работя...готово

Ако премахнете реда с <-готово, програмата най-вероятно ще приключи преди работника да свърши работа и може би преди да е започнал.

Следващ пример: .