golang print 和 fmt.Print 输出位置的问题

2022-02-22  本文已影响0人  sarto

用 golang 写一个对多行字符串进行排序的小工具,使用方法是 mlsort $file_name,然后将结果输出到屏幕上。

然后使用这个工具对文本进行排序,利用 shell 重定向,将输出写到 repo_sort.txt,结果发现输出一直在屏幕上,无法重定向到文件中,导致文件是空的。

root@merore-pc:/wk/quay/test-scripts# mlsort repo.txt > repo_sort.txt

我们知道 shell 有三个文件描述符,0 1 2,分别代表,标准输入标准输出,以及标准错误。而重定向只作用于标准输出,那么猜测,可能程序是输出到了 标准错误 了。为了验证这个猜想,我将错误输出重定向到标准输出,然后再把标准输出重定向到文件中。这次,屏幕不输出了,文件中有了内容。难道 golang 的输出一直是输出到错误输出的吗?

root@merore-pc:/wk/quay/test-scripts# mlsort repo.txt 2>&1 > repo_sort.txt 
root@merore-pc:/wk/quay/test-scripts# 

看了一下我的输出函数,是这么写的。

 21 func printStrings(ss []string) {
 22     for i := range ss {
 23         println(ss[i])
 24     }
 25 }  

原来我不小心使用了 println 内建函数,根据这个函数介绍,内建 println 仅用于程序本身调试,会将结果输出到 标准错误 中。

251 // The println built-in function formats its arguments in an
252 // implementation-specific way and writes the result to standard error.
253 // Spaces are always added between arguments and a newline is appended.
254 // Println is useful for bootstrapping and debugging; it is not guaranteed
255 // to stay in the language.
256 func println(args ...Type) 

而一般情况下,我们使用的应该是 fmt.Printlnfmt.Println 会输出到 标准输出 中。

 270 // Println formats using the default formats for its operands and writes to standard output.
 271 // Spaces are always added between operands and a newline is appended.
 272 // It returns the number of bytes written and any write error encountered.
 273 func Println(a ...interface{}) (n int, err error) {                                                                                                                                      
 274     return Fprintln(os.Stdout, a...)
 275 } 

更一般的,如果确实需要自定义输出格式和位置,可以使用 fmt.Fprintf

上一篇下一篇

猜你喜欢

热点阅读