Sobes.tech
Back to questions
Senior
5

func merge(chs ...<-chan int) <-chan int { ... } package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go func(n int) { defer wg.Done() fmt.Println(i) }(i) } wg.Wait() }

Companies where asked
X5 techX5 tech

Answer from AI

sobes.tech AI

В представленном коде есть классическая ошибка замыкания в горутинах:

for i := 0; i < 5; i++ {
    wg.Add(1)
    go func(n int) {
        defer wg.Done()
        fmt.Println(i) // Ошибка: здесь используется i из внешней области
    }(i)
}

Хотя параметр n передаётся в функцию, внутри используется переменная i из внешнего цикла. К моменту выполнения горутины значение i может быть уже равно 5, поэтому все горутины выведут 5.

Правильный вариант — использовать параметр n внутри горутины:

for i := 0; i < 5; i++ {
    wg.Add(1)
    go func(n int) {
        defer wg.Done()
        fmt.Println(n) // Используем параметр n
    }(i)
}

Это гарантирует, что каждая горутина выведет своё значение i на момент запуска.