Каналы: типы, принципы работы, буферизация

К вопросам
Средний
Concurrency

Вопрос

Расскажите о каналах в Go. Какие типы каналов существуют? Как работают буферизованные и небуферизованные каналы? В чем разница между отправкой и получением?

Ответ

Каналы - основной механизм коммуникации между горутинами. Типы каналов: - Небуферизованные (синхронные) - chan T - Буферизованные - make(chan T, capacity) - Направленные - chan<- T (только отправка), <-chan T (только получение) Небуферизованные каналы блокируют до получения сообщения. Буферизованные блокируют только при заполнении буфера.

// Небуферизованный канал
ch1 := make(chan int)

// Буферизованный канал
ch2 := make(chan int, 3)

// Направленные каналы
func sender(ch chan<- int) {
    ch <- 42
    close(ch)
}

func receiver(ch <-chan int) {
    for val := range ch {
        fmt.Println(val)
    }
}
// Небуферизованный канал
ch1 := make(chan int)

// Буферизованный канал
ch2 := make(chan int, 3)

// Направленные каналы
func sender(ch chan<- int) {
    ch <- 42
    close(ch)
}

func receiver(ch <-chan int) {
    for val := range ch {
        fmt.Println(val)
    }
}

Дополнительные вопросы

Что происходит при отправке в закрытый канал? Как избежать panic?