Channels

Канали|Channels #

// _Канали_ це магістралі для обміну повідомленнями між горутинами,
// які виконуються водночас. Ми можете надсилати
// дані до каналу в однієї горутини та отримувати у іншій.

package main

import "fmt"

func main() {

	// Канали створюються наступним синтаксисом `make(chan тип-каналу)` де
	// тип-каналу визначає значення якого типу можуть бути по ньому передані.
	messages := make(chan string)

	// _Надіслати_ значення до каналу можна використовуючи наступний
	// `channel <-` синтаксис. Використовуючи анонімну горутину,
	// ми надішлемо значення `ping` до каналу `messages`.
	go func() { messages <- "ping" }()

	// Наступний синтаксис `<-channel` описує _отримання_ значення з каналу.
	// Так ми отримуємо і друкуємо повідомлення `ping`, яке прийшло каналом
	// `messages` з анонімної горутини.
	msg := <-messages
	fmt.Println(msg)
}
# Коли ми запускаємо програму повідомлення `ping`
# успішно передається з однієї горутини до головної
# через канал повідомлень.
$ go run channels.go
ping

# Відповідно стандартних налаштувань _надсилання_
# та _отримання_ блокуватимуть виконання програми
# допоки _відправкник_ або _отримувач_ не будуть готові.
# Ця властивість дає нам змогу зачекати
# на повідомлення `ping` невикористовуючи інші
# типи синхронізації.