我有一个进行一些处理的程序,我想提供将输出保存到文件的选项,但是,我找不到最佳的方法。
if (strings.ToLower(input2) == "y") || (strings.ToLower(input2) == "yes") {
fmt.Println("\nOutputting to file, please wait... ")
oldSt := os.Stdout //Create backup of old Stdout
newFil, _ := os.Create(input+"txt")
os.Stdout = newFil
table.Render()
os.Stdout = oldSt
fmt.Println("\nComplete!")
}
这是我当前的代码,但似乎只是在打印到控制台而不重定向到文件。
我正在使用此程序包创建一个表,这正是我要输出到文件的表。
https://github.com/olekukonko/tablewriter
是否有更好的输出到文件的方法,或者因为我正在调用库函数,这将是另一种编写方法?
答案 0 :(得分:2)
为什么要将os.Stdout
更改为图书馆的文件?您正在使用的tablewriter软件包似乎接受了您希望使用的io.Writer
:
package main
import (
"fmt"
"log"
"os"
"github.com/olekukonko/tablewriter"
)
func main() {
fmt.Println("Outputting to file, please wait...")
f, err := os.Create("mahfile.txt")
if err != nil {
log.Fatal(err)
}
defer f.Close()
table := tablewriter.NewWriter(f)
table.Render()
}
https://play.golang.org/p/4L5Qu2SA4Uy
很显然,您可能需要以不同的顺序声明事物,但是我不建议您更改os.Stdout
的预期功能来实现您的目标。他们只是将其用作占位符供您覆盖。
但是,要回答您的问题:初始化tablewriter.NewWriter(os.Stdout)
时,向它提供了STDOUT的io.Writer
的副本-稍后在应用程序中替换os.Stdout
不会撤消此操作。
要完成您想要的工作,您将需要提供其他作家,如果需要的话,它可以在可能发生这种变化时意识到这一变化(请参阅第一个答案)
答案 1 :(得分:1)
由于tablewriter.NewWriter
将输出文件作为参数
tablewriter.NewWriter(os.Stdout)
os.Stdout
本身只是一个*File
,您可以将另一个文件传递给NewWriter。
var outputFile = os.Stdout
if userWantsToOutputToFile {
var userFile, fileErr = os.Create(desiredOutputFilename)
if fileErr != nil {
outputFile = userFile
}
}
// do your initialization
// then
tablewriter.NewWriter(outputFile)
顺便说一句,(仅供参考)如果您正在运行自己的进程,则只需将输出重定向到Shell上的文件
$ your_program -some-flags > output.txt