从没有for循环的其他程序流stdout

yng*_*ccc 3 go

我有一个程序,编译和运行另一个程序并将stdout传递给自己进行打印,因为该程序没有终止所以我需要流式传输它的stdout

// boilerplate ommited

func stream(stdoutPipe io.ReadCloser) {
    buffer := make([]byte, 100, 1000)
    for ;; {
        n, err := stdoutPipe.Read(buffer)
        if err == io.EOF {
            stdoutPipe.Close()
            break
        }
        buffer = buffer[0:n]
        os.Stdout.Write(buffer)
    }
}

func main() {
    command := exec.Command("go", "run", "my-program.go")
    stdoutPipe, _ := command.StdoutPipe()

    _ = command.Start()

    go stream(stdoutPipe)

    do_my_own_thing()

    command.Wait()
}
Run Code Online (Sandbox Code Playgroud)

它可以工作,但是如果不用for循环重复检查我该怎么做呢,是否有一个库函数做同样的事情?

Ste*_*erg 12

您可以将exec.Cmdan io.Writer用作stdout.您自己的程序用于stdout(os.Stdout)的变量也是一个io.Writer.

command := exec.Command("go", "run", "my-program.go")
command.Stdout = os.Stdout
command.Start()
command.Wait()
Run Code Online (Sandbox Code Playgroud)