Что выведет код 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 ошибок.
Предыдущий вопрос
Worker pool с сохранением порядка результатов
Следующий вопрос
Что выведет Go: pipeline из трёх стадий