golang单项通道引起锁死的原因

package main

import (
    "fmt"
)

func main() {
    ch1 := make(chan int)
    ch1 <- 200
    go readData(ch1)

    fmt.Println("main is over")

}

func readData(ch <-chan int) {

    data := <-ch
    fmt.Println("data is ", data)

}
 

以上代码会引起fatal error; 但是如果把加粗的两行调换位置,程序就正常了。

不明白为什么会引起这个错误,求大神指导。

你好,不知道你还有没有这个问题,这个牵扯到关于routine的理解。原因是这样,如果go关键字在前面,它会开一个goroutine并且持续往下走,不会阻塞主线程,而如果ch1 <- 这个在前面的话,这时候ch的另一边根本没有协程去读取,因此到了ch1 <- 这一句直接就over了,等不到go那一句

如果有帮助欢迎采纳哦