私は Go を学ぼうとしていて、しばらくやりたかったプロジェクトから始めようと思っていました (しかし、それは面倒すぎて気にすることができませんでした)。本質的なアイデアは、stdin/stdout でユーザーと対話するプログラムがあり、同じ方法でプログラムと対話する新しいプログラムを書きたいということです (あたかもプログラムを実行している人であるかのように)。
ここでのプログラムは単純で、同期的です。コマンドを入力し、出力を取得すると、次のバッチの入力を待機します。それほど難しくはないように思えましたが、この 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)
}
}
テイカーはいますか?