Каналы в Go создаются с помощью встроенной функции make()
. Существует два основных типа каналов:
Создается без указания размера буфера:
ch := make(chan int) // канал для передачи целых чисел
Характеристики:
Создается с указанием размера буфера:
ch := make(chan string, 5) // канал для строк с буфером на 5 элементов
Характеристики:
// Канал только для чтения
chReadOnly := make(<-chan bool)
// Канал только для записи
chWriteOnly := make(chan<- float64)
Закрытие канала выполняется с помощью встроенной функции close()
:
ch := make(chan int)
close(ch) // закрываем канал
Пример чтения из закрытого канала:
ch := make(chan int, 2)
ch <- 1
ch <- 2
close(ch)
val, ok := <-ch // val=1, ok=true
val, ok = <-ch // val=2, ok=true
val, ok = <-ch // val=0, ok=false (канал закрыт и пуст)
Канал можно использовать в цикле for-range, который автоматически завершится при закрытии канала:
for item := range ch {
// обрабатываем item
// цикл завершится, когда ch будет закрыт
}
close(ch)
close(ch) // panic: close of closed channel
var ch chan int
close(ch) // panic: close of nil channel
chan struct{}
Пример правильного использования:
func producer(ch chan<- int) {
defer close(ch) // гарантированное закрытие при завершении
for i := 0; i < 10; i++ {
ch <- i
}
}
func consumer(ch <-chan int) {
for num := range ch {
fmt.Println(num)
}
}
make(chan тип)
или make(chan тип, размер)
close()
, делая это аккуратно и однократно