我对Golang很新。我为练习编写了以下代码,并遇到了死锁的运行时错误消息:
package main
import (
"fmt"
)
func system(WORKERS int) {
fromW := make(chan bool)
toW := make(chan bool)
for i := 0; i != WORKERS; i++ {
go worker(toW, fromW)
}
coordinator(WORKERS, fromW, toW)
}
func coordinator(WORKERS int, in, out chan bool) {
result := true
for i := 0; i != WORKERS; i++ {
result = result && <-in
}
for i := 0; i != WORKERS; i++ {
out <- result
}
fmt.Println("%t", result)
}
func worker(in, out chan bool) {
out <- false
<-in
}
func main() {
system(2)
}
但是,如果我交换&amp;&amp;的操作数在第19行有
result = <-in && result,
代码正常工作而不返回任何错误消息。我该如何解释这种行为?我在这里错过了什么吗?我使用的操作系统是Windows 10,Golang版本是1.8.3。
非常感谢你。
答案 0 :(得分:6)
如您所见[{3}},&&
的右操作数会有条件地进行评估。
这意味着result = result && <-in
仅在<-in
为真时评估result
。因此,coodrinator只从该通道中读取一个false
,并跳过从其他工作者那里读取消息。如果你切换&&
个地方的操作数,那么<-in
每次都会评估并且死锁就会消失。