Обязательно упоминаются соответствующие факты, то есть то, что операции канала могут блокироваться, и что программы выполняются одновременно. Ваш конкретный пример - только применение этих основ.
но работаю в Голанге. Но все же я сталкиваюсь с этой проблемой, хотя знаю решение своей проблемы. Но так и не понял, почему это происходит.
Например, если у меня есть конвейерная ситуация для входящих и исходящих каналов, как показано ниже:
package main
import (
"fmt"
)
func main() {
for n := range sq(sq(gen(3, 4))) {
fmt.Println(n)
}
fmt.Println("Process completed")
}
func gen(nums ...int) <-chan int {
out := make(chan int)
go func() {
for _, n := range nums {
out <- n
}
close(out)
}()
return out
}
func sq(in <-chan int) <-chan int {
out := make(chan int)
go func() {
for n := range in {
out <- n * n
}
close(out)
}()
return out
}
Это не дает мне тупиковую ситуацию. Но если я удалю подпрограмму go внутри исходящего кода, как показано ниже:
func sq(in <-chan int) <-chan int {
out := make(chan int)
for n := range in {
out <- n * n
}
close(out)
return out
}
Я получил ошибку взаимоблокировки. Почему так, что зацикливание на каналах с использованием диапазона без go приводит к тупику.