Что выведет код Senior Каналы и select обновлено
Что выведет Go: слияние каналов с выключением веток через nil
Вопрос
Что выведет программа? Go 1.23, в go.mod указано go 1.23.
package main
import "fmt"
func main() {
a := make(chan int, 3)
b := make(chan int, 2)
for _, v := range []int{1, 2, 3} {
a <- v
}
for _, v := range []int{10, 20} {
b <- v
}
close(a)
close(b)
sum, iters := 0, 0
for a != nil || b != nil {
iters++
select {
case v, ok := <-a:
if !ok {
a = nil
continue
}
sum += v
case v, ok := <-b:
if !ok {
b = nil
continue
}
sum += v
}
}
fmt.Println(sum, iters)
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: 36 7. Порядок выбора веток случайный, но итог от него не зависит.
Что выведет
36 7
Разбор
Порядок выбора веток случайный, но итог от него не зависит. Пять итераций читают значения (сумма 36), ещё две обнаруживают закрытие каждого канала и выключают ветку присвоением nil: nil-канал никогда не готов. Когда оба nil, цикл завершается. Без a = nil закрытый канал оставался бы всегда готовым, и цикл крутился бы впустую.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.