go - 如何使用 Pipes 分配额外的 ExraFile 以拥有多个输出流?
问题描述
我有一个命令,我通过 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.ReadCloser
var inputPipe io.WriteCloser
outputPipe, inputPipe, err = os.Pipe()
cmd.ExtraFiles[0] = &inputPipe
cmd.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
呢?
解决方案
问题中的代码无法编译,因为*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的切片。分配容量小于长度的切片是错误的。
推荐阅读
- c# - 如何在 ScottPlot 中隐藏 double.NaN 值?
- angular - 使用 Angular 创建微前端的最佳方法是什么?
- tensorflow - 如何从张量流数据集中获取标签
- c++ - 为什么在使用转发引用时需要 std::forward?
- mysql - mysql获取最新行的记录集取决于其他列
- javascript - 使用 jQuery 复制表格行仅适用于前 3 列。并且删除功能不起作用
- python - 如何计算文本文件中每个人的平均人数
- javascript - 使用回调时如何让 JavaScript 等待用户输入?
- swift - 如何在不丢失导航栏 UI 的情况下更改 SwiftUI 背景?
- c# - 如何在使用 C# 选择图像时获取图像地址或图像 URL