```go package main func main() { nums := make(chan int, 10) for i := 0; i < 10; i++ { nums <- i } close(nums) for i := 0; i < 3; i++ { go sqare(nums) } } func sqare(nums <-chan int) <-chan int { res := make(chan int, 10) for n := range nums { res <- n * n } return res } ```
Ответ от нейросети
sobes.tech AI
В представленном коде есть несколько проблем, связанных с использованием каналов и горутин:
-
Функция
sqare(вероятно, опечатка, должно бытьsquare) принимает на вход каналnumsи создаёт новый каналres, в который записывает квадраты чисел. Но при этом функция возвращаетres, однако вmainэтот возвращаемый канал никак не используется. -
В
mainзапускаются 3 горутиныsqare(nums), которые одновременно читают из одного и того же каналаnums. Это может привести к тому, что каждый элемент будет обработан только одной горутиной, что, возможно, и ожидается. -
Однако, поскольку
resсоздаётся внутри каждой горутины и не передаётся наружу, результаты вычислений теряются.
Чтобы исправить код и получить квадраты чисел, можно сделать так:
- Создать один выходной канал
resвmain. - Передать его в горутины для записи результатов.
- В
mainсчитать изresрезультаты.
Пример исправленного кода:
package main
import (
"fmt"
"sync"
)
func main() {
nums := make(chan int, 10)
res := make(chan int, 10)
for i := 0; i < 10; i++ {
nums <- i
}
close(nums)
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go func() {
defer wg.Done()
square(nums, res)
}()
}
go func() {
wg.Wait()
close(res)
}()
for val := range res {
fmt.Println(val)
}
}
func square(nums <-chan int, res chan<- int) {
for n := range nums {
res <- n * n
}
}
В этом варианте три горутины параллельно читают из nums, вычисляют квадрат и пишут в общий канал res. После завершения всех горутин канал res закрывается, и main выводит все результаты.