练习 14.4:解释一下为什么如果在函数 getData () 的一开始插入 time.Sleep (2e9),不会出现错误但也没有输出呢。

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan string)
    go sendData(ch)
    go getData(ch)

    time.Sleep(1e9)
}

func sendData(ch chan string) {
    ch <- "1"
    ch <- "2"
    ch <- "3"
    ch <- "4"
    ch <- "5"
}

func getData(ch chan string) {
    time.Sleep(2e9)
    var input string
    for {
        input = <-ch
        fmt.Printf("%s ", input)
        fmt.Print("...")
    }
}

说一下我的理解,因为协程是异步的,但是又是依赖主线程的(主线程结束,相关协程也结束了)。
这里主线程只sleep了一秒
getData协程sleep了两秒
主进程都结束了,协程也结束了,自然执行不到后面的去管道去数据的操作了

ps:之前我没理解题意,想了半天。在setData和getData直接加的sleep(如下) 完全不影响出结果(因为协程是阻塞的,会等到管道输入和输出都准备完毕才开始数据传输)。

    go sendData(ch)
    time.Sleep(2e9)
    go getData(ch)

phpcoder

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

短小精湛的 Golang 入门教程,是 The Little Go Book 的中文翻译
Github 上《The Way to Go》中文译本的镜像,优化了排版
@无闻 出品的一套面向新手级别学习者 Go 语言的视频教程
一步步带你进入 Go Web 编程的世界,让我们开始探索吧!
号称宇宙最快的 Iris Web 框架的中文文档翻译
Gin 是一个用 Go 语言编写的 WEB 框架,本文档为其中文版本
GORM 是优秀的 Golang ORM 类库,本文档是其官方文档的中文翻译,每年更新