我在golang中将管道连接到我的stdout
,如下所示,以便进行测试(我删除了错误处理代码):
stdout := os.Stdout
defer func() {
os.Stdout = stdout
}()
r, w, _ = os.Pipe()
os.Stdout = w
var buf bytes.Buffer
fmt.Print(testOut)
w.Close()
io.Copy(&buf, r)
assert.Equal(t, testOut, buf.String())
我基本上也希望与stdin
做类似的事情。像这样:
stdin := os.Stdin
defer func() {
os.Stdin = stdin
}()
r, w, _ = os.Pipe()
os.Stdin = r
var in string
w.WriteString(testIn)
// w.Close()
fmt.Scan(&in)
assert.Equal(t, testIn, in)
但是,我不能让这个工作。如果我不关闭w
,fmt.Scan(&in)
永远不会返回。如果我关闭w
,我会收到file already closed
错误。
任何我想知道如何使这个工作?