我正在尝试学习围棋,我想我会从一个我想做一段时间的项目开始(但它似乎太“繁琐”而无法打扰)。基本思想是我有一个程序可以在 stdin/stdout 上与用户交互,我想编写一个新程序,该程序以相同的方式与程序交互(就好像它是一个运行程序的人一样)。现在这里的程序很简单,因为它是同步的:你输入一个命令,得到一些输出,然后它就坐在那里等待下一批输入。这看起来并不难,但我很难让这个 I/O 框架正常工作。package mainimport ( "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) }}有接班人吗?
2 回答
慕仙森
TA贡献1827条经验 获得超7个赞
你是在重新发明轮子,你想做的一切都可以由fmt包处理,所以只需使用它并在需要的地方添加额外的东西,比如随机数检查器。
以下是如何轻松实现此目标的示例:http : //play.golang.org/p/b9GnovSRFj
快速浏览一下,该策略的主要功能:
var s string
_, err := fmt.Scanf("%s", &s)
if err != nil {
log.Fatal(err)
}
fmt.Println(s)
请注意,由于权限问题,它不会在操场上运行,但如果您在本地运行它,它应该可以正常工作。
- 2 回答
- 0 关注
- 233 浏览
添加回答
举报
0/150
提交
取消