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

  1. Kanal ch on loodud ilma bufferita, ja gorutinides kirjutatakse kanalile, kuid peafunktsioonis algab kanali lugemine alles pärast wg.Wait(). See põhjustab gorutinide blokeerimise, kuna keegi ei loe kanalilt ja kanal ei ole bufferiga.

  2. Tsükkel for v := range ch ootab 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.