Основы работы с каналами
Что такое канал?
В Go канал (channel) представляет собой фундаментальный механизм связи, который позволяет горутинам (goroutines) безопасно и синхронно обмениваться данными. Каналы служат типизированными кондуитами, через которые можно отправлять и получать значения, что позволяет использовать конкурентные модели программирования.
Объявление и инициализация каналов
Каналы создаются с помощью функции make()
с указанием конкретного типа и, при необходимости, размера буфера:
// Небуферизованный канал
ch1 := make(chan int)
// Буферизованный канал с емкостью 5
ch2 := make(chan string, 5)
Типы каналов
Go поддерживает два основных типа каналов:
Тип канала |
Описание |
Поведение |
Небуферизованный (Unbuffered) |
Нет емкости |
Синхронное взаимодействие |
Буферизованный (Buffered) |
Имеет емкость |
Асинхронное взаимодействие |
Основные операции с каналами
Отправка и получение данных
// Отправка значения
ch <- value
// Получение значения
value := <-ch
Визуализация потока данных канала
graph LR
A[Горутина 1] -->|Отправить| C{Канал}
B[Горутина 2] -->|Получить| C
Направленность каналов
Go позволяет указывать направление канала для повышения безопасности типов:
// Канал только для отправки
var sendOnly chan<- int
// Канал только для приема
var receiveOnly <-chan int
Практический пример
package main
import "fmt"
func main() {
messages := make(chan string)
go func() {
messages <- "Hello, LabEx!"
}()
msg := <-messages
fmt.Println(msg)
}
В этом примере показано базовое взаимодействие между горутинами с использованием каналов.