gpt4 book ai didi

go - Go 中的持久化程序

转载 作者:IT王子 更新时间:2023-10-29 02:17:55 26 4
gpt4 key购买 nike

我正在尝试学习 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)

}
}

有人要吗?

最佳答案

您最大的问题是您正在重新分配命令的标准输入,而不是通过管道传递给它。

这是一个工作版本:

package main

import (
"bufio"
"fmt"
"math/rand"
"os/exec"
"time"
)

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)
}

progout, err := cmd.StdinPipe()
if err != nil {
fmt.Println("Trouble with e's stdin")
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)
progout.Write([]byte(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.go 进行一些修复:

package main

import (
"bufio"
"fmt"
"os"
"strings"
)

func main() {
for {
buf := bufio.NewReader(os.Stdin)
input, err := buf.ReadString('\n')

if err != nil {
fmt.Println("Echo failed: ", input)
panic(err)
}

if strings.HasPrefix(input, "exit") {
fmt.Println("Bye!")
return
}

fmt.Print(input)
}
}

关于go - Go 中的持久化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19668374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com