2 回答

TA贡献1785条经验 获得超8个赞
这个问题其实很简单。提示:以下代码以deadlock结尾。
package main
import "fmt"
func main() {
var c chan string
go func() {
c = make(chan string)
c <- "42"
}()
str := <-c
fmt.Println(str)
}
从那里,问题是微不足道的。当您启动 goroutine 时,您的频道未初始化。两个 goroutine 之间存在竞争,显然 go 无法决定哪个应该具有优先级。
所以,你的答案是:make(chan ...)在 goroutine 开始之前调用,它应该可以解决你的问题。在有效围棋中有一个完美的例子。

TA贡献1835条经验 获得超7个赞
Dave Cheney 有一篇很好的相关博文:http : //dave.cheney.net/2014/03/19/channel-axioms
最相关的点:
发送到 nil 通道永远阻塞
来自 nil 通道的接收永远阻塞
由于未初始化的通道为零,因此对其进行任何读写都会导致死锁。例如,在 T. Claverie 的回答中,有一场比赛:如果c = make(chan string)
, (并且c <- "42"
我相信此时str := <-c
必须等待)首先发生,然后从初始化的非空通道接收,一切运行正常:
package main
import "fmt"
import "time"
func main() {
var c chan string
go func() {
c = make(chan string)
c <- "42"
}()
time.Sleep(time.Second * 1)
str := <-c
fmt.Println(str)
}
你可以运行上面的例子来说服自己。(这不是好的做法,甚至不能保证每次都有效。)
但是,如果str := <-c先发生,那么您正在从一个nil通道接收,这会导致死锁。
- 2 回答
- 0 关注
- 204 浏览
添加回答
举报