格式化动词

常规

格式化动词 含义
%v 默认格式
%T 数据的类型
%% %本身

使用%v时不同类型默认对应的格式化动词如下:

数据类型 格式化动词 说明
bool %t
int int8 等 %d
uint uint8 等 %d %#v时对应%#x
float32 complex64 等 %g
string %s
chan %p
pointer %p

布尔型

格式化动词 含义 示例 结果
%t truefalse 1>2 false

整型

格式化动词 含义 示例 结果
%b 二进制 90 1011010
%c 对应的 Unicode 字符 90 Z
%d 十进制 90 90
%o 八进制 90 132
%O 0o前缀的八进制 90 0o132
%q 用单引号包括的对应的 Unicode 字符,并且特殊字符会进行转义 90 ‘Z’
%x 小写的十六进制 90 5a
%X 大写的十六进制 90 5A
%U Unicode 格式:U+1234;与U+%04X相同 90 U+005A

浮点型和复数型

格式化动词 含义 示例 结果
%b 十进制无小数的科学计数法表示浮点数,指数部分是2的幂次方 3.14 7070651414971679p-51
%e 小写e科学记数法 3.14 3.140000e+00
%E 大写E科学记数法 3.14 3.140000E+00
%f 常规的小数 3.14 3.140000
%F %f 3.14 3.140000
%g 大指数时同%e,否则同%f
%G 大指数时同%E,否则同%F
%x 小写的十六进制 3.14 0x1.91eb851eb851fp+01
%X 大写的十六进制 3.14 0X1.91EB851EB851FP+01

字符串和字节切片

格式化动词 含义 示例 结果
%s 原样 abc 中国(中间是 tab) abc 中国
%q 加双引号,并且特殊字符会进行转义 abc 中国(中间是 tab) “abc\t中国”
%x 小写的十六进制,带前缀0x abc 中国(中间是 tab) 61626309e4b8ade59bbd
%X 大写的十六进制,带前缀0X abc 中国(中间是 tab) 61626309E4b8EDE59BBD

切片

格式化动词 含义
%p 首元素地址,用加前缀0x的小写十六进制数表示

指针

格式化动词 含义 示例 结果
%p 加前缀0x的小写十六进制

%b%d%o%x%X也可用于指针。

其它标志

+

格式化动词 含义
%+d %+f 对于数值型,总是打印符号+/-
%+v 对于结构体将显示对应字段名

-

默认是左对齐,加上-后则右对齐

#

格式化动词 含义
%#b 加前缀0b
%#o 加前缀0o
%#x 加前缀0x
%#X 加前缀0X
%#p 去掉前缀0x
%#q 如果字符串可以用反引号括起来,则打印原始(用反引号括起来的)字符串
%#e %#E %#f %#F 总是打印小数点
%#g %#G 总是打印小数点,且不删除尾部的0
%#U 如果字符是可打印的,会以U+0078 'x'的形式输出。
%#v 对于复合类型,会显示其完整的创建表达式。对于浮点数中的无穷大(Inf)和非数字(NaN),会以+Inf-InfNaN的形式输出

空格

格式化动词 含义
% d % f 对于数值类型,如果是正数,在前面留一个空格代替正号,实现与负数在符号上的对齐
% x % X 在打印字符串或切片时,会在字节之间添加空格

w.p宽度和精度

wp分别为宽度和精度的具体数值。

格式化动词 含义
%wd 仅指定宽度,实际宽度超出时按实际宽度显示,不足时左边用空格补齐
%.pd 仅指定精度,实际宽度超出时按实际宽度显示,不足时左边用0补齐
%w.pd 同时指定宽度和精度,先用%.pd格式化,再用%wd格式化
%wf 仅指定宽度,精度默认,实际宽度(含小数点及小数部分)超出时按实际宽度显示,不足时左边用空格补齐
%w.f 指定宽度,精度为0,实际宽度(不含小数点及小数部分)超出时按实际宽度显示,不足时左边用空格补齐
%.pf 仅指定精度,小数部分超出时截断,不足时右边用0补齐
%w.pf 同时指定宽度和精度,先格式化精度,再格式化宽度,宽度不足时左边用空格补齐

*

*可对w.p中的w或/和p进行占位,解决/简化运行时对数据进行不同宽度、精度的格式化。

1
2
3
fmt.Printf("%*.*f\n", 8, 2, f)
//与以下等效
fmt.Printf("%8.2f\n", f)

0前缀

0需要在指定了w.pw>0时使用才有效。

格式化动词 含义
%0w.pd 实际宽度超出时按实际宽度显示,不足时左边用0补齐
%0w.pf 先格式化精度,再格式化宽度,宽度不足时左边用0补齐

[n]索引

默认情况下,一个格式化动词对应一个操作数,且顺序固定。

若使用[n]索引,则可不必拘泥于操作数的顺序,且在同一条格式化语句中可以多次对同一个值进行格式化。示例如下:

1
2
fmt.Printf("%[2]d,%[1]d\n", a, b) //显示为 b,a
fmt.Printf("%[1]T,%[1]d\n", a)    //显示为 a的类型,a的值

特别注意 1:n是从1开始!

特别注意 2:[n]会影响后续索引!

1
fmt.Printf("%d %d %#[1]x %#x", 16, 17) //输出 16 17 0x10 0x11