Я пытаюсь иметь две отдельные подпрограммы для пользователей, которые будут фильтровать четные и нечетные числа из входного канала. Это всего лишь пример игрушки, чтобы увидеть, есть ли у потребителей возможность что-то сделать с сообщением, считываемым из входного канала, если оно соответствует определенному условию, в противном случае возвращается обратно на входной канал.«Потребляйте или возвращайте» каналы «Go»
Мой текущий код выглядит следующим образом:
package main
func filterOdd(ch chan int, out chan int) {
val := <- ch
if val % 2 == 0 {
ch <- val
} else {
out <- val
}
}
func filterEven(ch chan int, out chan int) {
val := <- ch
if val % 2 != 0 {
ch <- val
} else {
out <- val
}
}
func main() {
even := make(chan int)
odd := make(chan int)
input := make(chan int)
go filterOdd(input, odd)
go filterEven(input, even)
for i:=1; i <= 10; i++ {
input <- i
}
println("Even...")
for i := range even {
println(i)
}
println("Odd...")
for i := range odd {
println(i)
}
}
Однако, это производит следующий вывод:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/tmp/sandbox594577124/main.go:27 +0x140
goroutine 4 [chan send]:
main.filterOdd(0x10336100, 0x103360c0)
/tmp/sandbox594577124/main.go:8 +0xc0
created by main.main
/tmp/sandbox594577124/main.go:24 +0xc0
Ссылка на Go Playground: https://play.golang.org/p/9RIvFsGKI-
@ ZanLynx: в то время как этот вопрос говорит, что они имеют тупик в своем образце кода, похоже, что они пытаются сделать то же самое, что и в этом другом вопросе. –
@JamesHenstridge Конечно, не то же самое. Но похоже, что общая проблема и решение для этого вопроса одинаковы. –
И я заметил, что даже если вы исправите буферизацию, ваши циклы for не находятся в goroutines и, следовательно, будут блокироваться, если вы никогда не делаете свои буферы большими, чем размер вашего цикла. –