Обработка чисел из двух каналов и запись в третий на Go

Написал решение задачи на Go. Решение компилируется но на тестах выдаёт, что ожидает одно число из канала, а получает другое. Помогите разобраться, где ошибка.

Задание:

Необходимо написать функцию func Merge2Channels(f func(int) int, in1 <-chan int, in2 <- chan int, out chan<- int, n int) в package main.

Описание ее работы:

  • n раз сделать следующее
  • прочитать по одному числу из каждого из двух каналов in1 и in2, назовем их x1 и x2.
  • вычислить f(x1) + f(x2)
  • записать полученное значение в out
  • Функция Merge2Channels должна быть неблокирующей, сразу возвращая управление.
  • Функция f может работать долгое время, ожидая чего-либо или производя вычисления.

Мой код:

package main

func calc(f func(int) int, x1 int, x2 int, out chan int) {
    out <- f(x1) + f(x2)
}

func Merge2Channels(f func(int) int, in1 chan int, in2 chan int, out chan int, n int) {
  for i := 0; i < n; i++ {
      x1, x2 := <-in1, <-in2
      println(x1, x2)
      go calc(f, x1, x2, out)
  }
}

Сообщение об ошибке следующее:


panic: Got 140498 from output channel, should be 83602 [recovered]
    panic: Got 140498 from output channel, should be 83602

goroutine 38 [running]:
panic(0x54cfc0, 0xc82000a5d0)
    /usr/lib/go/src/runtime/panic.go:464 +0x3e6
testing.tRunner.func1(0xc820078090)
    /usr/lib/go/src/testing/testing.go:467 +0x192
panic(0x54cfc0, 0xc82000a5d0)
    /usr/lib/go/src/runtime/panic.go:426 +0x4e9
_/temp/executing.TestSlowSquare(0xc820078090)
    /temp/executing/main_test.go:104 +0x61f
testing.tRunner(0xc820078090, 0x64c4f8)
    /usr/lib/go/src/testing/testing.go:473 +0x98
created by testing.RunTests
    /usr/lib/go/src/testing/testing.go:582 +0x892
make: *** [run] Error 1

Ответы (1 шт):

Автор решения: Евгений Залужанский

Текст ошибки более чем понятный и вывод из него только один - порядок чисел в ответе важен. А у тебя N никак не синхронизированных горутин. Вот в помощь

→ Ссылка