Назад к вопросам
МВидео
Middle+
4
// числа от 1 до 10 func main() { done := make(chan struct{}, 10) for i:=1; i<=10; i++{ go func(){ defer func() {done<-struct{}{}}() printNumber(n) }() } for i:=1; i<=10; i++{ <-done } } func printNumber(n int) { time.Sleep(time.Second) fmt.Println(n) }
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
В представленном коде есть несколько ошибок:
-
В горутине используется переменная
n, которая не определена. Нужно передаватьiкак параметр в анонимную функцию, чтобы избежать проблемы с замыканием. -
Канал
doneсоздан с буфером 10, что не критично, но можно сделать без буфера.
Исправленный вариант:
package main
import (
"fmt"
"time"
)
func main() {
done := make(chan struct{})
for i := 1; i <= 10; i++ {
go func(n int) {
defer func() { done <- struct{}{} }()
printNumber(n)
}(i)
}
for i := 1; i <= 10; i++ {
<-done
}
}
func printNumber(n int) {
time.Sleep(time.Second)
fmt.Println(n)
}
Объяснение:
- Передача
iв горутину как параметраnфиксирует значение для каждой итерации. - Канал
doneиспользуется для синхронизации — главный поток ждёт завершения всех горутин. printNumberвыводит число с задержкой в 1 секунду.
Так программа корректно выведет числа от 1 до 10 (в любом порядке, так как горутины работают параллельно).