Код, который вы разместили, не компилируется, как есть, и вы не описываете проблему (что происходит вместо ожидаемого результата), но, посмотрев на код, у меня есть два предложения:
Сделать результатБуферизованный канал, длина 1:
results := make(chan *models.Receipt, 1)
Это позволяет goroutine, который заканчивается первым, записать результат в канал и выйти, уменьшив таким образом счетчик группы ожидания.
В конце вместоisCalculated.Set()
вы должны использовать SetToIf
, чтобы не устанавливать флаг / результат дважды (и, следовательно, останавливаться, так как читатель все еще ждет, пока группа ожидания завершит свою работу, и поэтому вторая программа не сможетзаписать в канал, что означает, что группа ожидания никогда не достигает нуля):
log.Println("Writing result to channel...")
if isCalculated.SetToIf(false, true) {
results <- receipt
}