美文网首页
golang print 和 fmt.Print 输出位置的问题

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

作者: sarto | 来源:发表于2022-02-22 11:09 被阅读0次

    用 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

    相关文章

      网友评论

          本文标题:golang print 和 fmt.Print 输出位置的问题

          本文链接:https://www.haomeiwen.com/subject/nafglrtx.html