golang为什么无法在主线程上向channel传值

syo*_*jyo 3 go goroutine

情况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 正常?

Ini*_*ian 5

您认为为什么会发生这种case1情况case2?这些通道旨在充当发送方和接收方之间的同步原语。您有一个发送者在某个通道上发送,dogChan但没有人在该通道上接收。如果没有接收 goroutine 或 goroutine 上的接收操作,发送方只会阻塞(作为无缓冲通道)

同样的问题case4,您在通道上有两个发送,但在 goroutine 上有一个接收。将dogChan <- 2永远阻塞。在 中case5,如果您的目的是从通道中读取数据,只需使用循环range来迭代通过通道发送的连续值即可。