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

来自io.ReadCloser的ReadLine

来自io.ReadCloser的ReadLine

Go
繁星点点滴滴 2021-05-04 17:36:24
我需要找到一种从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例程中监视缓冲区。我尝试了2种方法。1)nr, er := out.Read(buf)其中buf是一个字节数组。这里的问题是我需要为每个新行制动数组2)我的第二个选择是创建一个新的bufio.reader ,如果我执行像这样的命令,则可以正常运行,但如果我执行则可以正常运行一个PHP脚本,它立即得到文件结尾错误并退出(我猜这是由于PHP的输出延迟)r := bufio.NewReader(out)    line,_,e := r.ReadLine()ls编辑:我的问题是我正在go例程内创建bufio.Reader,而如果我在StdoutPipe()像minikomi建议的那样做后,它可以正常工作
查看完整描述

1 回答

?
MM们

TA贡献1886条经验 获得超2个赞

您可以使用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的方式从阅读器中读取内容,但没有任何停止脚本的步骤,它将退出。


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

添加回答

举报

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