Sobes.tech
Back to questions
Middle+
3

// числа от 1 до 10 func main() { done := make(chan struct{}, max_n) for i := 1; i <= max_n; i += batchSize { end := i + batchSize if end > max_n { end = max_n } for j := i; j < end; j++ { go func(n int) { defer func() { done <- struct{}{} }() exit(1) printNumber(n) }(j) } for j := i; j < end; j++ { <-done } } } func printNumber(n int) { time.Sleep(time.Second) fmt.Println(n) }

Companies where asked
МВидеоМВидео

Answer from AI

sobes.tech AI

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

  1. Переменные max_n и batchSize не определены, предположим, что max_n = 10, batchSize = 3.

  2. Внутри горутины вызывается exit(1), что завершит программу сразу при первом запуске горутины, и последующий код printNumber(n) не выполнится. Скорее всего, это ошибка.

  3. Использование канала done с буфером max_n для синхронизации горутин — правильный подход, чтобы дождаться завершения всех горутин в батче.

  4. В цикле for j := i; j < end; j++ условие должно быть j <= end или end должен быть i + batchSize - 1, чтобы включить нужное количество элементов.

Исправленный пример кода:

package main

import (
    "fmt"
    "time"
)

const (
    max_n    = 10
    batchSize = 3
)

func main() {
    done := make(chan struct{}, max_n)

    for i := 1; i <= max_n; i += batchSize {
        end := i + batchSize
        if end > max_n+1 {
            end = max_n + 1
        }

        for j := i; j < end; j++ {
            go func(n int) {
                defer func() { done <- struct{}{} }()
                printNumber(n)
            }(j)
        }

        for j := i; j < end; j++ {
            <-done
        }
    }
}

func printNumber(n int) {
    time.Sleep(time.Second)
    fmt.Println(n)
}

Таким образом, программа выводит числа от 1 до 10, запуская горутины пакетами по 3, и дожидается завершения каждого пакета перед запуском следующего. Это позволяет контролировать количество одновременно работающих горутин и упорядочить вывод.