tgoop.com/golang_interview/483
Create:
Last Update:
Last Update:
Loop:
for {
select {
case val, ok :=<- someChan:
if !ok {
// канал закрыт
break Loop
}
// получены данные, работа с val
default:
// канал пуст, что-то делать
}
}
Здесь,
ok будет истиной только для открытого канала. Но при закрытии по каналу будут приходить пустые сообщения постоянно и ok будет ложью.Однако вышеприведённая конструкция оптимальна только если нужно выполнять действие в
default-ветке. Т.е. что-то делать, когда сообщений нет. Есть более простая и понятная конструкцияfor val := range someChan {
// получено сообщение
}
// канал закрытВ этом случае канал читается, используя
for-range. Когда канал будет закрыт и из него будет прочитано последнее сообщение, произойдёт выход из цикла.Запись в закрытый канал вызывает панику.
Дизайн приложения должен быть таким, что сторона создающая канал, его же и закрывает и пишет в него то же она. Более того, в этих случая рекомендуется, что б функция возвращала канал только для чтения
func run () <-chan string {
c := make(chan string)
// [...]
}Конечно можно в отложенном вызове вызвать
recover(), чтобы подавить панику. Но это в корне неправильно. @golang_interview

