🔗 Что такое канал?

Каналы — это способ обмена данными между горутинами. Они позволяют синхронизировать выполнение и передавать значения.

Объявление канала:

ch := make(chan int) // канал для передачи int

📤 Отправка и приём

  • Отправка значения в канал:

    ch <- 42
    
  • Приём значения из канала:

    value := <-ch
    

Эти операции блокируются, пока другая сторона не выполнит противоположную операцию.


🧵 Пример: обмен значением

func worker(ch chan string) {
    msg := <-ch
    fmt.Println("Получено:", msg)
}

func main() {
    ch := make(chan string)
    go worker(ch)

    ch <- "Привет, горутина!"
    time.Sleep(time.Second)
}

📚 Буферизированные каналы

Можно создать канал с буфером:

ch := make(chan int, 2)

Теперь можно отправить два значения без блокировки:

ch <- 1
ch <- 2

Третья отправка будет ждать, пока кто-то не прочитает значение из канала.


🚪 Закрытие канала

Канал можно закрыть, чтобы сообщить, что больше не будет значений:

close(ch)

При чтении из закрытого канала возвращается нулевое значение типа и false:

val, ok := <-ch
if !ok {
    fmt.Println("Канал закрыт")
}

📌 Главное из главы

  • Каналы — способ общения между горутинами.
  • Они синхронизируют передачу значений.
  • Бывают буферизированные и небуферизированные.
  • Закрытие канала — важный инструмент завершения обмена.

В следующей главе ты узнаешь, как использовать шаблоны конкурентности, чтобы писать безопасный и эффективный параллельный код.