Senior
κύριο πακέτο εισαγωγή ( "fmt" "sync" ) λειτουργία main() { ch := make(chan int) wg := &sync.WaitGroup{} wg.Add(3) for i := 0; i < 3; i++ { go func(v int) { defer wg.Done() ch <- v * v }(i) } wg.Wait() var sum int for v := range ch { sum += v } fmt.Printf("αποτέλεσμα: %d\n", sum) }
sobes.tech AI
Απάντηση από AI
Σε αυτόν τον κώδικα υπάρχουν αρκετά προβλήματα:
-
Το κανάλι
chδημιουργείται χωρίς buffer, και στις goroutines γράφεται στο κανάλι, αλλά στη βασική λειτουργία η ανάγνωση από το κανάλι ξεκινά μόνο μετά τοwg.Wait(). Αυτό οδηγεί σε μπλοκάρισμα των goroutines, καθώς κανείς δεν διαβάζει από το κανάλι και το κανάλι δεν έχει buffer. -
Ο βρόχος
for v := range chθα περιμένει επ' αόριστον, επειδή το κανάλι δεν έχει κλείσει, και μετά την εγγραφή τριών τιμών, το πρόγραμμα δεν θα τερματίσει.
Για να διορθωθεί ο κώδικας:
- Κάντε το κανάλι buffered με μέγεθος 3 (αριθμός goroutines), ώστε οι goroutines να μπορούν να γράφουν τιμές χωρίς μπλοκάρισμα.
- Κλείστε το κανάλι αφού όλες οι goroutines ολοκληρωθούν.
Παραδείγματα διορθωμένου κώδικα:
package main
import (
"fmt"
"sync"
)
func main() {
ch := make(chan int, 3) // buffered κανάλι
wg := &sync.WaitGroup{}
wg.Add(3)
for i := 0; i < 3; i++ {
go func(v int) {
defer wg.Done()
ch <- v * v
}(i)
}
wg.Wait()
close(ch) // κλείνουμε το κανάλι
var sum int
for v := range ch {
sum += v
}
fmt.Printf("αποτέλεσμα: %d\n", sum)
}
Τώρα το πρόγραμμα υπολογίζει σωστά το άθροισμα των τετραγώνων των αριθμών 0, 1 και 2 και εμφανίζει το αποτέλεσμα.