练习 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
(= ̄ω ̄=)··· 暂无内容!

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