Back to questions
X5 tech
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
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 на момент запуска.