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` і запускаємо горутину `worker`,
	// виділивши цей канал їй для комунікації.
	done := make(chan bool, 1)
	go worker(done)

	// Чекаємо повідомлення про завершення роботи `worker`'a,
	// з каналу до якого ми передали повідомлення.
	<-done
}
# Якщо ви приберете `<-done` з коду,
# то програма завершиться, ще до того як `worker`
# буде запущено.
$ go run channel-synchronization.go
working...done