情况1
package main
func main() {
dogChan := make(chan int)
dogChan <- 1
}
Run Code Online (Sandbox Code Playgroud)
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/Users/xuzhongwei/Source/awesomeProject/main.go:5 +0x50
Run Code Online (Sandbox Code Playgroud)
案例2
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/Users/xuzhongwei/Source/awesomeProject/main.go:5 +0x50
Run Code Online (Sandbox Code Playgroud)
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/Users/xuzhongwei/Source/awesomeProject/main.go:9 +0x72
Run Code Online (Sandbox Code Playgroud)
案例3
package main
func main() {
dogChan := make(chan int)
go func(ch chan int) {
}(dogChan)
dogChan <- 1
}
Run Code Online (Sandbox Code Playgroud)
案例4
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/Users/xuzhongwei/Source/awesomeProject/main.go:9 +0x72
Run Code Online (Sandbox Code Playgroud)
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/Users/xuzhongwei/Source/awesomeProject/main.go:10 +0x90
Run Code Online (Sandbox Code Playgroud)
案例5
package main
func main() {
dogChan := make(chan int)
go func(ch chan int) {
<- ch
}(dogChan)
dogChan <- 1
}
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么 case1、case2 出错而 case3 正常?在情况1中,我的猜测是dogChan没有在goroutine中使用,因此它被视为关闭。在case2中,我的猜测是,虽然dogChan在goroutine中传递,但它并没有在goroutine中使用,所以它被视为关闭
谁能告诉我为什么 case4 出错而 case5 正常?
您认为为什么会发生这种case1情况case2?这些通道旨在充当发送方和接收方之间的同步原语。您有一个发送者在某个通道上发送,dogChan但没有人在该通道上接收。如果没有接收 goroutine 或 goroutine 上的接收操作,发送方只会阻塞(作为无缓冲通道)
同样的问题case4,您在通道上有两个发送,但在 goroutine 上有一个接收。将dogChan <- 2永远阻塞。在 中case5,如果您的目的是从通道中读取数据,只需使用循环range来迭代通过通道发送的连续值即可。
| 归档时间: |
|
| 查看次数: |
1023 次 |
| 最近记录: |