В представленном коде есть несколько ошибок:
// числа от 1 до 10
В представленном коде есть несколько ошибок:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
// числа от 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) }
Ответ
В представленном коде есть несколько ошибок:
- В горутине используется переменная
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 (в любом порядке, так как горутины работают параллельно).