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 AI

Απάντηση από AI

Στον παρουσιασμένο κώδικα υπάρχουν αρκετά σφάλματα και πιθανά προβλήματα:

  1. Ορθογραφικό λάθος στην παράμετρο της συνάρτησης: sync.WaitGrop αντί για sync.WaitGroup.
  2. Στον βρόχο for i := 0; i < 10; i++ καλείται wg.Add(8), αλλά ξεκινούν 10 goroutines — αυτό θα οδηγήσει σε deadlock, καθώς το wg.Done() θα κληθεί 10 φορές, αλλά η αναμονή αφορά μόνο 8.
  3. Η μεταβίβαση της μεταβλητής 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".