我在努力去學習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