Как возвести в квадрат элементы массива с использованием каналов
Как возвести в квадрат элементы массива применяя каналы, мое решение возвращает пустой массив
func double(i int) int {
return i * i
}
func SquareCh(arr []int) []int {
ch := make(chan int)
res := make([]int, 0)
for i := range arr {
go func(ch chan int) {
ch <- double(arr[i])
res = append(res, <-ch)
}(ch)
}
return res
}
Ответы (1 шт):
Автор решения: Pak Uula
→ Ссылка
Я подозреваю, что "применяя каналы" подразумевает иное решение - функция возведения в квадрат пишет в канал, а не вызывает горутины для возведения в квадрат отдельных элементов массива.
Я бы делал вот в каком виде:
package main
import "fmt"
func double(i int) int {
return i * i
}
func SquareCh(arr []int, ch chan int) {
for i := range arr {
ch <- double(arr[i])
}
close(ch)
}
func main() {
ints := []int{1, 2, 3, 4, 5}
squares := []int{}
ch := make(chan int)
go SquareCh(ints, ch)
for {
square, not_closed := <-ch
if !not_closed {
break
}
squares = append(squares, square)
}
fmt.Println(squares)
}
Инструкция go SquareCh(ints, ch) запускает квадрификатор в отдельной горутине. Эта функция пишет в канал квадраты элементов среза и в конце закрывает канал.
Инструкция square, not_closed := <-ch не только читает следующий квадрат из канала, но ещё проверяет, что канал не закрыт.