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

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

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 невикористовуючи інші типи синхронізації.

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