Sobes.tech
Senior

asosiy paket kiritish ( "fmt" "sync" ) fun 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("natija: %d\n", sum) }

sobes.tech AI

AIdan javob

Ushbu kodda bir nechta muammo mavjud:

  1. ch kanali bufersiz yaratilgan va gorutinlarda kanalga yozish amalga oshirilmoqda, ammo asosiy funksiyada kanalni o'qish faqat wg.Wait() dan so'ng boshlanadi. Bu gorutinlarning bloklanishiga olib keladi, chunki hech kim kanaldan o'qmayapti va kanal buferlangan emas.

  2. for v := range ch sikli cheksiz kutadi, chunki kanal yopilmagan va uchta qiymat yozilgandan so'ng, dastur tugamaydi.

Kodni tuzatish uchun:

  • Kanalni 3 o'lchovli bufer bilan qilish (gorutinlar soni), shunda gorutinlar qiymatlarni bloklamasdan yozishlari mumkin.
  • Barcha gorutinlar tugagach, kanali yopish.

Tuzatilgan misol:

package main

import (
	"fmt"
	"sync"
)

func main() {
	ch := make(chan int, 3) // buferli 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) // kanali yopamiz

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

Endi dastur 0, 1 va 2 sonlarining kvadratlarining yig'indisini to'g'ri hisoblaydi va natijani chiqaradi.