Закрытие канала в Go
Закрытие канала в Go выполняется с помощью встроенной функции close.
Она сигнализирует получателям, что в канал больше не будут отправляться новые данные.
Закрытие канала полезно для корректного завершения горутин и предотвращения deadlock'ов.
Функция close принимает один параметр - канал, который нужно закрыть.
Важно: закрывать можно только каналы, отправлять данные в закрытый канал нельзя - это вызовет панику.
Синтаксис
close(ch)
Пример
Давайте создадим канал, отправим в него одно значение, закроем канал и прочитаем данные:
package main
import "fmt"
func main() {
ch := make(chan int)
go func() {
ch <- 42
close(ch)
}()
res := <-ch
fmt.Println(res)
}
Результат выполнения кода:
42
Пример
Давайте проверим, как работает чтение из закрытого канала с помощью второго возвращаемого значения, которое показывает, было ли значение получено из канала до его закрытия:
package main
import "fmt"
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
close(ch)
for i := 0; i < 3; i++ {
res, ok := <-ch
fmt.Printf("%d, %t\n", res, ok)
}
}
Результат выполнения кода:
"1, true"
"2, true"
"0, false"
Пример
Использование закрытия канала для корректного завершения горутины при переборе значений с помощью range:
package main
import "fmt"
func main() {
ch := make(chan int)
go func() {
for i := 1; i <= 5; i++ {
ch <- i
}
close(ch)
}()
for res := range ch {
fmt.Println(res)
}
}
Результат выполнения кода:
"1"
"2"
"3"
"4"
"5"
Смотрите также
-
функцию
chan,
которая создает канал для передачи данных между горутинами -
функцию
buffered-chan,
которая создает буферизированный канал -
функцию
unbuffered-chan,
которая создает небуферизированный канал -
функцию
send,
которая описывает отправку данных в канал