Я считаю, что правильный путь для достижения этой цели - использование StdinPipe
и StdoutPipe
методов exec.Cmd
.
См. Примеры в https://golang.org/pkg/os/exec/#Cmd.StdinPipe, и т. Д.
Вот пример, который вызывает команду bc
(встроенный калькулятор, который берет вычисления из стандартного ввода и отправляет результаты в стандартный вывод) и немного взаимодействует с ним:
package main
import (
"bufio"
"fmt"
"log"
"os/exec"
)
func main() {
cmd := exec.Command("bc", "-q")
stdin, err := cmd.StdinPipe()
if err != nil {
log.Fatal(err)
}
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Fatal(err)
}
if err := cmd.Start(); err != nil {
log.Fatal(err)
}
stdin.Write([]byte("2 + 2\n"))
r := bufio.NewReader(stdout)
b, err := r.ReadBytes('\n')
if err != nil {
log.Fatal(err)
}
fmt.Println("Read:", string(b))
}
В реальной программе выможет захотеть запустить эту вещь в обычной программе, чтобы она не блокировала остальную часть приложения, происходила в фоновом режиме и т. д.