Что выведет код Middle Паттерны конкурентности обновлено

Что выведет Go: слияние каналов fan-in

Вопрос

Что выведет программа? Go 1.23, в go.mod указано go 1.23.

package main

import (
    "fmt"
    "sort"
    "sync"
)

func source(vals ...int) <-chan int {
    out := make(chan int)
    go func() {
        defer close(out)
        for _, v := range vals {
            out <- v
        }
    }()
    return out
}

func merge(cs ...<-chan int) <-chan int {
    out := make(chan int)
    var wg sync.WaitGroup
    for _, c := range cs {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for v := range c {
                out <- v
            }
        }()
    }
    go func() { wg.Wait(); close(out) }()
    return out
}

func main() {
    var got []int
    for v := range merge(source(3, 1), source(2), source()) {
        got = append(got, v)
    }
    sort.Ints(got)
    fmt.Println(got, len(got))
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: [1 2 3] 3. Порядок прихода значений из разных источников не определён, поэтому результат сортируется.

Что выведет

[1 2 3] 3

Разбор

Порядок прихода значений из разных источников не определён, поэтому результат сортируется. Пустой источник сразу закрывается. Выходной канал закрывает отдельная горутина после того, как все копирующие горутины закончили, и range в main завершается.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.