Закрытие канала в Go
Закрытие помечает канал как завершенный: новые отправки в него запрещены, а прием из пустого закрытого канала сразу отдает нулевое значение типа и признак, что данных больше нет.
Отправитель кладет числа, затем завершает канал; получатель читает с двумя результатами:
package main
import "fmt"
func main() {
ch := make(chan int)
go func() {
ch <- 1
ch <- 2
close(ch)
}()
for i := 0; i < 3; i++ {
v, ok := <-ch
fmt.Println(v, ok)
}
}
Первые две строки печатают 1 и
2 с true. Третья дает
0 и false: канал пуст и
закрыт.
Повторная отправка в уже закрытый канал останавливает программу. Закрывать нужно только отправитель, который больше не будет писать:
package main
import "fmt"
func main() {
ch := make(chan int, 1)
ch <- 5
close(ch)
v, ok := <-ch
fmt.Println(v, ok)
}
Дан следующий код:
ch := make(chan int)
close(ch)
v, ok := <-ch
Скажите, какие будут v и ok
после приема.
Дан следующий код:
ch := make(chan int)
close(ch)
ch <- 1
Скажите, что произойдет с программой на последней строке.
Скажите, зачем при чтении из канала иногда берут второй результат вместе со значением.