TOC

Golang: 格式化输出

Golang 格式化输出靠 fmt

方法

(f|s)?(scan|print)(f|ln)? 一组合就有 18 个方法了,再加上一个 Errorf

func Errorf(format string, a ...interface{}) error
func Fprint(w io.Writer, a ...interface{}) (n int, err error)
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
func Fprintln(w io.Writer, a ...interface{}) (n int, err error)
func Fscan(r io.Reader, a ...interface{}) (n int, err error)
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
func Print(a ...interface{}) (n int, err error)
func Printf(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)
func Scan(a ...interface{}) (n int, err error)
func Scanf(format string, a ...interface{}) (n int, err error)
func Scanln(a ...interface{}) (n int, err error)
func Sprint(a ...interface{}) string
func Sprintf(format string, a ...interface{}) string
func Sprintln(a ...interface{}) string
func Sscan(str string, a ...interface{}) (n int, err error)
func Sscanf(str string, format string, a ...interface{}) (n int, err error)
func Sscanln(str string, a ...interface{}) (n int, err error)

type Formatter
type GoStringer
type ScanState
type Scanner
type State
type Stringer

后缀:f,ln

  • f 表示格式化
  • ln 表示换行

另外 ln 会在参数之间添加空格,而默认只会在都不是字符串的参数之间添加空格。

Fprint,Sprint,Print 之间的区别

  • Print 输出到标准输出(如果相连两个参数都不是字符串,会自动添加空格)
  • Sprint 返回字符串
  • Fprint 输出到指定输出流(io.Writer 类型)
package main

import (
    "fmt"
    "io"
    "os"
)

func main() {
    const name, age = "Kim", 22
    fmt.Print(name, " is ", age, age, " years old.\n")
    s := fmt.Sprint(name, " is ", age, age, " years old.\n")
    io.WriteString(os.Stdout, s) // Ignoring error for simplicity.
}

// Kim is 22 22 years old.
// Kim is 22 22 years old.

占位符

%v  # 值
%+v # 对于 struct,可以显示字段名称
%#v # 值(Go 语法)
%T  # 值的类型(Go 语法)
%%

# Boolean
%t  # true, false

# Integer: dbox cu
%d  # base10    dec,decimal ['desɪml]
%b  # base2     bin,binary  ['baɪnəri]
%o  # base8     oct,octal   ['ɒktl]
%O  # base8 with 0o prefix
%x  # base16    hex,hexadecimal [ˌheksə'desɪml]
%X  # base16 uppercase
%c  # Unicode Character
%U  # U+%04X

# Float: befg
%b  # 一种少见的计数法
    # 例如:-123456p-78,表示 -(123456 / (2^78)) = -1624.421052631579
%e  # 自然计数法,欧拉数
%E  # 自然计数法 (大写 E)
%f  # 传统的小数表示
%F  # 等于 %f
%g  # 自动 %e, %f
%G  # 自动 %E, %F

# String OR SliceOfBytes:
%s
%q  # Go 语法转义, 双引号
%x  # base16
%X  # base16 uppercase

# Pointer
# Slice 0 号元素的位置
%p  # 0x 开头,十六进制
# 对指针也可以使用 b d o x 代表的各种进制。

# 前缀
+    # 打印数值的正负号
-    # 左对齐(右侧填充)
0    # 使用 0 填充

# 空格前缀
% d        # 为正负号留出空格
% x / % X  # 字节之间加空格

# 井号前缀
%#o        # 带前导 0 的八进制
%#x / %#X  # 带前导 0x 的十六进制
%#p        # 不带前导 0x 的十六进制
%#q        # Go 语法转义,反引号
%#U        # Unicode 编码之后再加改字符

宽度

%f     default width, default precision
%9f    width 9, default precision
%.2f   default width, precision 2
%9.2f  width 9, precision 2
%9.f   width 9, precision 0

占位符 v 的意义

bool:                    %t
int, int8 etc.:          %d
uint, uint8 etc.:        %d, %#x if printed with %#v
float32, complex64, etc: %g
string:                  %s
chan:                    %p
pointer:                 %p

复合类型的显示

struct:             {field0 field1 ...}
array, slice:       [elem0 elem1 ...]
maps:               map[key1:value1 key2:value2 ...]
pointer to above:   &{}, &[], &map[]

示例


参考资料与拓展阅读