Как мне назначить дополнительные ExraFiles, используя Pipes, чтобы иметь более одного выходного потока? - PullRequest
1 голос
/ 21 января 2020

У меня есть команда, которой я отправляю данные через 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

I ' Я уверен, что мы можем назначить каналы, так как я, например, могу использовать функцию StdoutPipe(), и она работает, как и ожидалось.

Как мне это сделать с os.ExtraFiles?

1 Ответ

1 голос
/ 21 января 2020

Код в вопросе не компилируется, поскольку значения *os.File, возвращаемые из os.Pipe, хранятся в переменных с типами интерфейсов io.ReadCloser и io.WriteCloser. Указатели на значения с этими типами не могут быть присвоены *os.File.

Исправлено путем присвоения возвращаемых значений переменным типа *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. Ошибочно выделять секцию с емкостью меньше длины.
...