Sobes.tech
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

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

  1. Το κανάλι ch δημιουργείται χωρίς buffer, και στις goroutines γράφεται στο κανάλι, αλλά στη βασική λειτουργία η ανάγνωση από το κανάλι ξεκινά μόνο μετά το wg.Wait(). Αυτό οδηγεί σε μπλοκάρισμα των goroutines, καθώς κανείς δεν διαβάζει από το κανάλι και το κανάλι δεν έχει buffer.

  2. Ο βρόχος 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 και εμφανίζει το αποτέλεσμα.