我正在尝试学习 Go,我想我会从一个我想做一段时间的项目开始(但这似乎太“繁琐”而无法打扰)。基本思想是我有一个程序可以在标准输入/标准输出上与用户交互,我想编写一个新程序,它以相同的方式与程序交互(就好像它是一个运行程序的人一样)。
现在这里的程序很简单,因为它是同步的:你输入一个命令,得到一些输出,然后它就坐在那里等待下一批输入。这似乎并不难,但我无法让这个 I/O 框架正常工作。
package main
import (
"os/exec"
"time"
"bufio"
"math/rand"
"fmt"
"strings"
)
func main() {
cmd := exec.Command("e") // A simple program that echos input until it becomes "exit"
progin, err := cmd.StdoutPipe()
if err != nil {
fmt.Println("Trouble with e's stdout")
panic(err)
}
err = cmd.Start()
if err != nil {
fmt.Println("Trouble starting e")
panic(err)
}
r := rand.New(rand.NewSource(99))
buf := bufio.NewReader(progin)
for {
// Write stuff
var toProg string
if (r.Float64() < .1) {
toProg = "exit"
} else {
toProg = fmt.Sprintf("%d", r.Int)
}
fmt.Println("Printing: ", toProg)
cmd.Stdin = strings.NewReader(toProg + "\n")
// Read stuff
time.Sleep(500 * time.Millisecond) // give the program time to generate output
input, err := buf.ReadString('\n')
if err != nil {
fmt.Println("I did *not* like that: ", input)
panic(err)
}
fmt.Println("Received: ", input)
}
}
有接盘侠吗?