Sobes.tech
Back to questions
Senior
2

```go func main() { wg := sync.WaitGroup{} wg.Add(8) for i := 0; i < 10; i++ { go func(wg *sync.WaitGrop, i int) { defer wg.Done() fmt.Println(i) }(&wg,i) } wg.Wait() fmt.Println("some text") time.Sleep(1 * time.Minute) fmt.Println("some text2") } ```

Companies where asked
Базис

Answer from AI

sobes.tech AI

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

  1. Опечатка в параметре функции: sync.WaitGrop вместо sync.WaitGroup.
  2. В цикле for i := 0; i < 10; i++ вызывается wg.Add(8), но запускается 10 горутин — это приведёт к дедлоку, так как wg.Done() будет вызвано 10 раз, а ожидание — только 8.
  3. Передача переменной i в замыкание корректная, так как i передаётся как параметр, что предотвращает классическую ошибку с замыканиями в цикле.

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

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup

    wg.Add(10) // Количество горутин должно совпадать с Add
    for i := 0; i < 10; i++ {
        go func(wg *sync.WaitGroup, i int) {
            defer wg.Done()
            fmt.Println(i)
        }(&wg, i)
    }
    wg.Wait()
    fmt.Println("some text")
    time.Sleep(1 * time.Minute)
    fmt.Println("some text2")
}

Таким образом, код корректно создаёт 10 горутин, каждая из которых выводит своё значение i, затем основной поток ждёт завершения всех горутин, выводит "some text", ждёт минуту и выводит "some text2".