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:
- Tipphiba a függvény paraméterében:
sync.WaitGrophelyettsync.WaitGroup. - A
for i := 0; i < 10; i++ciklusbanwg.Add(8)van hívva, de 10 goroutine indul — ez deadlock-hoz vezet, mivel awg.Done()10-szer lesz hívva, de a várakozás csak 8-ra vonatkozik. - A
iváltozó átadása a lezárásnak helyes, miveliparamé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.