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

在Go中,如何将函数的stdout捕获到字符串中?

在Go中,如何将函数的stdout捕获到字符串中?

Go
慕姐4208626 2021-05-04 01:13:08
例如,在Python中,我可以执行以下操作:realout = sys.stdoutsys.stdout = StringIO.StringIO()some_function() # prints to stdout get captured in the StringIO objectresult = sys.stdout.getvalue()sys.stdout = realout您可以在Go中执行此操作吗?
查看完整描述

3 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

我同意,fmt.Fprint只要可以管理,就应该使用这些功能。但是,如果您不控制要捕获其输出的代码,则可能没有该选项。


Mostafa的答案有效,但是如果您想在没有临时文件的情况下进行操作,则可以使用os.Pipe。这是一个与Mostafa等效的示例,其中一些代码受Go的测试包的启发。


package main


import (

    "bytes"

    "fmt"

    "io"

    "os"

)


func print() {

    fmt.Println("output")

}


func main() {

    old := os.Stdout // keep backup of the real stdout

    r, w, _ := os.Pipe()

    os.Stdout = w


    print()


    outC := make(chan string)

    // copy the output in a separate goroutine so printing can't block indefinitely

    go func() {

        var buf bytes.Buffer

        io.Copy(&buf, r)

        outC <- buf.String()

    }()


    // back to normal state

    w.Close()

    os.Stdout = old // restoring the real stdout

    out := <-outC


    // reading our temp stdout

    fmt.Println("previous output:")

    fmt.Print(out)

}


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

添加回答

举报

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