Senior
peamine pakett 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("rezultāts: %d\n", sum) }
sobes.tech AI
Vastus AI-lt
Selles koodis on mitu probleemi:
-
Kanal
chon loodud ilma bufferita, ja gorutinides kirjutatakse kanalile, kuid peafunktsioonis algab kanali lugemine alles pärastwg.Wait(). See põhjustab gorutinide blokeerimise, kuna keegi ei loe kanalilt ja kanal ei ole bufferiga. -
Tsükkel
for v := range chootab lõpmatuseni, kuna kanal ei ole suletud, ja pärast kolme väärtuse kirjutamist programm ei lõpe.
Koodi parandamiseks:
- Muutke kanal bufferiseerituks suurusega 3 (gorutinide arv), nii et gorutinid saaksid väärtusi kirjutada ilma blokeerimata.
- Sulgege kanal pärast kõigi gorutinide lõpetamist.
Parandatud näide:
package main
import (
"fmt"
"sync"
)
func main() {
ch := make(chan int, 3) // bufferiga kanal
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) // sulgeme kanali
var sum int
for v := range ch {
sum += v
}
fmt.Printf("tulemus: %d\n", sum)
}
Nüüd arvutab programm õigesti 0, 1 ja 2 arvude ruutude summa ja kuvab tulemuse.