我已经在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
}
我收到了一个死锁错误。为什么使用range循环通道而不使用go例程会导致死锁。
sq
中删除了 goroutine,这正是被要求的(您的答案仍然解决了问题)。如果我改变了您的意图,请重新编辑。 - Motti同步:
1)写入通道
2)写入通道-阻塞
而异步使用可以像这样:异步:
1)写入通道
2)从通道读取
3)写入通道
4)从通道读取
- iHelos