我在努力去学习Go,我想我会从一个我想做一段时间的项目开始(但这似乎太“烦人”了)。基本的想法是,我有一个程序在stdin/stdout上与用户交互,我想写一个新的程序,以相同的方式与程序交互(就好像它是一个运行程序的人)。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)
}
}
任何接受者?
为了进行测试,下面是源'e':http://pastebin.com/59Qc3bxy – Charles