Sobes.tech
Senior

hlavný balík import ( "fmt" "sync" ) func 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("výsledok: %d\n", sum) }

sobes.tech AI

Odpoveď od AI

V tomto kóde je niekoľko problémov:

  1. Kanál ch je vytvorený bez bufferu, a v gorutinách sa zapisuje do kanála, ale v hlavnej funkcii sa čítanie z kanála začína až po wg.Wait(). To spôsobí zablokovanie gorutín, pretože nikto nečíta z kanála a kanál nie je buffered.

  2. Cyklus for v := range ch bude čakať do nekonečna, pretože kanál nie je zatvorený, a po zápise troch hodnôt sa program neskončí.

Na opravu kódu:

  • Urobte kanál buffered s veľkosťou 3 (počet gorutín), aby gorutiny mohli zapisovať hodnoty bez blokovania.
  • Zatvorte kanál po tom, čo všetky gorutiny skončia.

Príklad opraveného kódu:

package main

import (
	"fmt"
	"sync"
)

func main() {
	ch := make(chan int, 3) // buffered kanál
	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) // zatvárame kanál

	var sum int
	for v := range ch {
		sum += v
	}
	fmt.Printf("výsledok: %d\n", sum)
}

Teraz program správne vypočíta súčet štvorcov čísel 0, 1 a 2 a zobrazí výsledok.