Golang 中国

superqbb

Golang China 第 9180 号会员,加入于 2018-12-01 16:06


superqbb最近创建的主题


superqbb最近回复了


回复了 samete 创建的主题: go 协程问题 2018-12-01 16:10

因为主线程执行到

for v := range results {
    fmt.Println(v)
}

时, channel为空,会等待协程写入数据,当协程写入数据时,就会被主协程捕获并打印。由于只有一个协程在写消息,因此主协程打印的顺序没有乱。你可以通过运行下面的代码感受一下

func main() {
    chanOwner := func() <-chan int {
        results := make(chan int, 5)
        go func() {
            defer fmt.Println("释放channel")
            defer close(results)
            for i := 0; i <= 5; i++ {
                fmt.Printf("发送消息:%v\n",i)
                results <- i
                time.Sleep(1*time.Second)
            }
        }()
        for v := range results {
            fmt.Println(v)
        }
        fmt.Println("读取完毕")
        return results
    }
    chanOwner()
}
superqbb 创建的更多回复