为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中的持久化程序

Go 中的持久化程序

Go
猛跑小猪 2021-07-02 14:03:30
我正在尝试学习围棋,我想我会从一个我想做一段时间的项目开始(但它似乎太“繁琐”而无法打扰)。基本思想是我有一个程序可以在 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)

请注意,由于权限问题,它不会在操场上运行,但如果您在本地运行它,它应该可以正常工作。


查看完整回答
反对 回复 2021-07-05
  • 2 回答
  • 0 关注
  • 233 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信