Go за Прикладом: Канали (Channels)

Work in Progress / Сайт в процесі розробки

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

package main
import "fmt"
func main() {

Канали створюються наступним синтаксисом make(chan тип-каналу). Канали типізовані типом змінної що вони передають.

    messages := make(chan string)

Надіслати значення до каналу можна використовуючи channel <- синтаксис. Ось тут ми надішлемо "ping" до каналу messages що ми створити з горутини анонімної функції.

    go func() { messages <- "ping" }()

Синтаксис <-channel отримує значення з каналу. Ось тут ми отримуємо повідомлення "ping", що ми щойно відправили і друкуємо його до екрану.

    msg := <-messages
    fmt.Println(msg)
}

Коли ми запускаємо прогрумму повідомлення "ping" успішно передається з однтєї горутини до нашої программи через наш канал.

$ go run channels.go
ping

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

Наступний приклад: Буферизація каналiв (Channel Buffering).