Каналы: типы, принципы работы, буферизация
Вопрос
Расскажите о каналах в 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?