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 AI
Απάντηση από AI
Στον παρουσιασμένο κώδικα υπάρχουν αρκετά σφάλματα και πιθανά προβλήματα:
- Ορθογραφικό λάθος στην παράμετρο της συνάρτησης:
sync.WaitGropαντί γιαsync.WaitGroup. - Στον βρόχο
for i := 0; i < 10; i++καλείταιwg.Add(8), αλλά ξεκινούν 10 goroutines — αυτό θα οδηγήσει σε deadlock, καθώς τοwg.Done()θα κληθεί 10 φορές, αλλά η αναμονή αφορά μόνο 8. - Η μεταβίβαση της μεταβλητής
iστο κλείσιμο είναι σωστή, καθώς τοiπερνάει ως παράμετρος, αποτρέποντας το κλασικό σφάλμα με τα κλεισίματα σε βρόχους.
Διορθωμένο παράδειγμα:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
wg.Add(10) // Ο αριθμός των goroutines πρέπει να ταιριάζει με το 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 goroutines, καθεμία από τις οποίες εμφανίζει την τιμή i, και το κύριο νήμα περιμένει να ολοκληρωθούν όλες, εμφανίζει "some text", περιμένει ένα λεπτό και στη συνέχεια εμφανίζει "some text2".