Как возвести в квадрат элементы массива с использованием каналов

Как возвести в квадрат элементы массива применяя каналы, мое решение возвращает пустой массив

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 не только читает следующий квадрат из канала, но ещё проверяет, что канал не закрыт.

→ Ссылка