我在 Golang 工作了很长时间。但是,尽管我知道解决问题的方法,但我仍然面临这个问题。但是从来没有想过为什么会这样。
例如,如果我有如下入站和出站通道的管道情况:
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 routine 的情况下使用 range 循环通道会导致死锁。
隔江千里
梦里花落0921
ITMISS
撒科打诨
相关分类