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)


    }

}

有接班人吗?


猛跑小猪
浏览 234回答 2
2回答

慕仙森

你是在重新发明轮子,你想做的一切都可以由fmt包处理,所以只需使用它并在需要的地方添加额外的东西,比如随机数检查器。以下是如何轻松实现此目标的示例:http : //play.golang.org/p/b9GnovSRFj快速浏览一下,该策略的主要功能:var s string_, err := fmt.Scanf("%s", &s)if err != nil {&nbsp; &nbsp; log.Fatal(err)}fmt.Println(s)请注意,由于权限问题,它不会在操场上运行,但如果您在本地运行它,它应该可以正常工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go