go - 如何将 os.Stdout 输出复制到字符串变量
问题描述
我有这样的功能:
package main
import (
"fmt"
)
// PrintSomething prints some thing
func PrintSomething() {
fmt.Println("print something")
}
func main() {
PrintSomething()
}
如何将 PrintSomething 包装到另一个函数调用 CaptureSomething 以将字符串“print something”保存到变量并返回它?
解决方案
创建管道并将标准输出设置为管道编写器。启动一个 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
}
推荐阅读
- javascript - Hiding elements when a textbox empty
- vuejs3 - Why the render h function cannot use component name directly to render in Vue3.x as Vue2.x?
- node.js - Mongoose/ Express Populate issue
- android - 如何在android上的jwt令牌到期时导航到登录屏幕
- webpack - 将 NuxtJS 生成的静态文件复制到父文件夹
- android - Android 子菜单出现在主菜单的位置
- php - PHP一次发送多个api请求
- vue.js - 返回父级时未呈现Vue-router路由
- machine-learning - Keras 中深度学习模型的实现
- blockchain - 获取 Solidity 映射的密钥