如何将 os.Stdout 输出复制到字符串变量

2024-02-09

我有一个这样的函数:

package main

import (
    "fmt"
)

// PrintSomething prints some thing
func PrintSomething() {
    fmt.Println("print something")
}

func main() {
    PrintSomething()
}

如何将 PrintSomething 包装到另一个函数调用 CaptureSomething 以将字符串“print Something”保存到变量并返回它?


Create pipe https://godoc.org/os#Pipe并设置stdout https://godoc.org/os#Stdout给管道作者。启动一个 goroutine 将管道读取器复制到缓冲区。完成后,关闭管道编写器并等待 goroutine 完成读取。以字符串形式返回缓冲区。

// capture replaces os.Stdout with a writer that buffers any data written 
// to os.Stdout. Call the returned function to cleanup and get the data
// as a string.
func capture() func() (string, error) {
    r, w, err := os.Pipe()
    if err != nil {
        panic(err)
    }

    done := make(chan error, 1)

    save := os.Stdout
    os.Stdout = w

    var buf strings.Builder

    go func() {
        _, err := io.Copy(&buf, r)
        r.Close()
        done <- err
    }()

    return func() (string, error) {
        os.Stdout = save
        w.Close()
        err := <-done
        return buf.String(), err
    }

}

像这样使用它:

done := capture()
fmt.Println("Hello, playground")
capturedOutput, err := done()
if err != nil {
    // handle error
}

游乐场示例 https://play.golang.org/p/bG3opmVoOLy

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 os.Stdout 输出复制到字符串变量 的相关文章