练习 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)
推荐文章: