为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Pipes 分配额外的 ExraFile 以拥有多个输出流?

如何使用 Pipes 分配额外的 ExraFile 以拥有多个输出流?

Go
慕仙森 2022-05-05 18:12:50
我有一个命令,我通过 Stdin 向其发送数据并期望 28 个输出流(包括Stdout)。所以我想cmd.ExtraFiles为os.Pipe每个os.ExtraFiles.我写了以下内容:backgroundContext, cancelCommand := context.WithCancel(context.Background())cmd := exec.CommandContext(backgroundContext, "command", args...)cmd.ExtraFiles = make([]*io.File, 27, 0)var outputPipe io.ReadCloservar inputPipe io.WriteCloseroutputPipe, inputPipe, err = os.Pipe()cmd.ExtraFiles[0] = &inputPipecmd.ExtraFiles[1] = &outputPipe由于类型不匹配,最后两行会产生错误:./main.go:876:26: cannot use &inputPipe (type *io.WriteCloser) as type *os.File in assignment./main.go:877:26: cannot use &outputPipe (type *io.ReadCloser) as type *os.File in assignment我确信我们可以分配管道,因为例如我可以使用该StdoutPipe()功能并且它按预期工作。我该怎么做os.ExtraFiles呢?
查看完整描述

1 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

问题中的代码无法编译,因为*os.File从 os.Pipe 返回的值存储在具有接口类型io.ReadCloser和io.WriteCloser. 指向具有这些类型的值的指针不能分配给*os.File.


通过将返回值分配给 type 的变量来修复*os.File。


cmd.ExtraFiles = make([]*os.File, 27)

outputPipe, inputPipe, err := os.Pipe()

if err != nil {

    // handle error

}

cmd.ExtraFiles[0] = inputPipe

cmd.ExtraFiles[1] = outputPipe

奖励修复:


是os.File,不是io.File。

分配长度和容量为27的切片。分配容量小于长度的切片是错误的。


查看完整回答
反对 回复 2022-05-05
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信