Go 格式化

105 阅读5分钟

文章首发于个人博客

格式化动词

常规

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

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

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

布尔型

格式化动词含义示例结果
%ttruefalse1>2false

整型

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

浮点型和复数型

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

字符串和字节切片

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

切片

格式化动词含义
%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进行占位,解决/简化运行时对数据进行不同宽度、精度的格式化。

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]索引,则可不必拘泥于操作数的顺序,且在同一条格式化语句中可以多次对同一个值进行格式化。示例如下:

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

注意:n是从1开始!