以下是我一直在玩的一些代码:
package main
import "fmt"
func main() {
channel := make(chan int)
flag := false
go func() {
for {
channel <- 1
}
}()
for {
select {
case <-channel:
fmt.Println(flag)
if !flag {
flag = true
break
}
fmt.Println(flag)
}
}
}
我希望在那里至少有一个false
,但是当我执行代码时,我只会得到true
。有人可以解释为什么吗?
我确定它与锁有关,但是当我尝试将case
内容包装在锁周围时,我得到了false
(最后!),然后是fatal error: all goroutines are asleep - deadlock!
:
for {
select {
case <-channel:
mutex.Lock()
fmt.Println(flag)
if !flag {
flag = true
break
}
fmt.Println(flag)
mutex.Unlock()
default:
// no communication
}
}
答案 0 :(得分:0)
没有理由用互斥锁使flag
变形,因为它周围的代码不是并发的。
您可以在https://play.golang.org/p/OJue5lcIZlw处检查代码,它确实会打印第一个false
。
为什么您会收到leaf bebop所说的错误,原因是因为您破坏了代码,陷入了试图锁定锁定的互斥锁的死锁。
您可以使用defer mutex.Unlock()
或在break
之前解锁以解决该问题。