gpt4 book ai didi

Go Stdin Stdout 通信

转载 作者:数据小太阳 更新时间:2023-10-29 03:24:05 24 4
gpt4 key购买 nike

我想执行一个 go 文件,我将在 yaml 配置文件中指定它,并以字节为单位向它发送一个 Struct。我怎么能这样做?

我认为我可以为此使用 Stdin 和 Stdout

但是想不通Yaml 配置:

subscribers:
temp:
topics:
- pi/+/temp
action: ./temp/tempBinary

这是我的代码:

client.Subscribe(NewTopic(a), func(c *Client, msg Message) {
cmd := exec.Command(v.Action)

// I actually want to send [msg] to it so it can be used there
cmd.Stdin = bytes.NewReader(msg.Bytes())

if err := cmd.Start(); err != nil {
c.Logger.Infof("Error while executing action: %v", err)
} else {
c.Logger.Info("Executed command")
}

// I want to handle responses from the called binary
var out bytes.Buffer
cmd.Stdout = &out
c.Logger.Infof("Response: %v", out)
})

我想不通我究竟是怎么做到的。

最佳答案

https://golang.org/pkg/os/exec/#example_Cmd_StdinPip 中有一个很好的示例说明您需要什么, https://golang.org/pkg/os/exec/#example_Cmd_StdoutPipehttps://golang.org/pkg/io/ioutil/#example_ReadAll

一个好的开始应该是这样的:

stdin, err := cmd.StdinPipe()
if err != nil {
log.Fatal(err)
}
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Fatal(err)
}
defer stdin.Close()
io.WriteString(stdin, msg.String())

b, err := ioutil.ReadAll(stdout)
if err != nil {
log.Fatal(err)
}
c.Logger.Infof("Response %s", stdout)

但是这个解决方案甚至没有开始处理边缘情况,例如管道提前关闭等。

这个视频很好地讲述了这样的事情: https://www.youtube.com/watch?v=LHZ2CAZE6Gs&feature=youtu.be&list=PL6

关于Go Stdin Stdout 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46935219/

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