以下例子运行结果是什么?
package main
import "fmt"
func main() {
var ch chan int
go func() {
fmt.Println("B")
ch <- 0
}()
<-ch
fmt.Println("A")
}
请思考…
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
运行结果
B
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive (nil chan)]:
main.main()
/data/demo.go:34 +0x51
goroutine 18 [chan send (nil chan)]:
main.main.func1(0x0)
/data/demo.go:32 +0x93
created by main.main
/data/demo.go:30 +0x45
exit status 2
请思考为什么会出现deadlock?
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
因为 var ch chan int
只是声明 了变量 ch
, 并未赋值, 所以 ch
是nil
. 当向一个nil
channel 中写入时会阻塞, 因此导致例子程序死锁
func main() {
var ch chan int
fmt.Println(ch) // nil
ch2 := make(chan int)
fmt.Println(ch2) // 0xc000192000
}
参考: https://stackoverflow.com/questions/54413564/whats-the-difference-between-var-a-chan-int-and-a-makechan-int