Skip to content

Instantly share code, notes, and snippets.

@Vostbur
Created December 18, 2022 11:25
Show Gist options
  • Save Vostbur/c00aad5236e9d43b0d0ae0a43e8578b9 to your computer and use it in GitHub Desktop.
Save Vostbur/c00aad5236e9d43b0d0ae0a43e8578b9 to your computer and use it in GitHub Desktop.
Stepic.Golang. Goroutines

Вам необходимо написать функцию calculator следующего вида:

func calculator(arguments <-chan int, done <-chan struct{}) <-chan int

В качестве аргумента эта функция получает два канала только для чтения, возвращает канал только для чтения.

Через канал arguments функция получит ряд чисел, а через канал done - сигнал о необходимости завершить работу. Когда сигнал о завершении работы будет получен, функция должна в выходной (возвращенный) канал отправить сумму полученных чисел.

Функция calculator должна быть неблокирующей, сразу возвращая управление.

Выходной канал должен быть закрыт после выполнения всех оговоренных условий, если вы этого не сделаете, то превысите предельное время работы.

package main
import (
"fmt"
)
func calculator(arguments <-chan int, done <-chan struct{}) <-chan int {
out := make(chan int)
go func() {
defer close(out)
sum := 0
for {
select {
case i := <-arguments:
sum += i
case <-done:
out <- sum
return
}
}
}()
return out
}
func main() {
arguments := make(chan int)
done := make(chan struct{})
result := calculator(arguments, done)
for i := 0; i < 10; i++ {
arguments <- i
}
close(done)
fmt.Println(<-result)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment