【发布时间】:2020-08-15 13:38:37
【问题描述】:
我认为我在正确的轨道上,但我的解决方案只是挂起并且没有在屏幕上打印任何内容,我在这里做错了什么?
r, w := io.Pipe()
var stdout, stderr bytes.Buffer
cmd.Stdout = w
cmd.Stderr = &stderr
tstdout := io.TeeReader(r, os.Stdout)
tstderr := io.TeeReader(r, os.Stderr)
io.Copy(&stdout, tstdout)
io.Copy(&stderr, tstderr)
err := cmd.Run()
res := processResult{
stderr.String(),
stdout.Bytes(),
}
【问题讨论】:
-
您调用
io.Copy而不将其拆分为 goroutine。这将从 tee-reader 的tstdout读取,直到 tee-reader 返回 EOF。 tee-reader 从管道的读取端r读取。写端当前是打开的,没有要读取的字节,所以io.Copy等待treader的数据(或EOF)。没有其他任何东西提供任何数据,所以io.Copy继续等待,就像 tee 阅读器一样,两者都将一直这样做,或者直到某个其他事件终止程序 - 没有其他人有r,所以没有人在上面写还没有。 -
如果你将两个
io.Copy调用作为新的 goroutines 分离出来,你会得到更好的结果。