Что выведет код 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 ошибок.