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.Println
,fmt.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
。