gpt4 book ai didi

go - 来自 io.ReadCloser 的 ReadLine

转载 作者:IT王子 更新时间:2023-10-29 00:57:06 25 4
gpt4 key购买 nike

我需要找到一种方法来从 io.ReadCloser 对象中读取一行,或者找到一种在“结束行”符号上拆分字节数组的方法。但是我不知道结束线符号,我找不到它。

我的应用程序执行一个 php 脚本,需要从脚本中获取实时输出,并在获取时对其进行“处理”。

这是我的一小段代码:

cmd := exec.Command(prog, args)   
/* cmd := exec.Command("ls")*/
out, err := cmd.StdoutPipe()
if err != nil {
fmt.Println(err)
}
err = cmd.Start()
if err != nil {
fmt.Println(err)
}

在此之后我监控 out在 go 例程中缓冲。我试过两种方法。
1) nr, er := out.Read(buf)其中 buf是一个字节数组。这里的问题是我需要为每条新线制动阵列
2) 我的第二个选择是创建一个新的 bufio.reader
r := bufio.NewReader(out)<br/>
line,_,e := r.ReadLine()

如果我执行像 ls 这样的命令,它运行良好,我逐行得到输出,但是如果我执行一个 php 脚本,它会立即得到一个文件结束错误并退出(我猜这是因为 php 的延迟输出)

编辑:我的问题是我在 go 例程中创建了 bufio.Reader,而如果我在 StdoutPipe() 之后立即创建它正如 minikomi 所建议的那样,它工作正常

最佳答案

您可以使用 bufio 创建一个阅读器,然后阅读直到下一个换行符(注意,单引号表示字符!):

stdout, err := cmd.StdoutPipe()
rd := bufio.NewReader(stdout)
if err := cmd.Start(); err != nil {
log.Fatal("Buffer Error:", err)
}

for {
str, err := rd.ReadString('\n')
if err != nil {
log.Fatal("Read Error:", err)
return
}
fmt.Println(str)
}

如果您尝试在 goroutine 中读取读取器而没有停止脚本,它将退出。

关于go - 来自 io.ReadCloser 的 ReadLine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13065010/

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