Sobes.tech
Назад к вопросам
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

В представленном коде есть несколько ошибок:

  1. В горутине используется переменная n, которая не определена. Нужно передавать i как параметр в анонимную функцию, чтобы избежать проблемы с замыканием.

  2. Канал 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 (в любом порядке, так как горутины работают параллельно).