Sobes.tech
Senior

```go func main() { wg := sync.WaitGroup{} wg.Add(8) 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") } ```

sobes.tech MI

Válasz az MI-től

A bemutatott kódban több hiba és potenciális probléma van:

  1. Tipphiba a függvény paraméterében: sync.WaitGrop helyett sync.WaitGroup.
  2. A for i := 0; i < 10; i++ ciklusban wg.Add(8) van hívva, de 10 goroutine indul — ez deadlock-hoz vezet, mivel a wg.Done() 10-szer lesz hívva, de a várakozás csak 8-ra vonatkozik.
  3. A i változó átadása a lezárásnak helyes, mivel i paraméterként kerül átadásra, ez megelőzi a klasszikus hibát a ciklusok lezárásaival.

Javított példa:

package main

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

func main() {
    var wg sync.WaitGroup

    wg.Add(10) // A goroutine-ok száma egyezik az Add értékével
    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")
}

Így a kód helyesen hoz létre 10 goroutine-t, amelyek mindegyike kiírja saját i értékét, majd a fő szál várja, hogy mindegyik befejeződjön, kiírja az "some text"-et, vár egy percet, és végül kiírja az "some text2"-t.