fmt包——格式化输入输出
在之前章节中我们已经多次看到fmt
这个包。fmt
包实现了类似C语言printf
和scanf
的格式化I/O。
go的格式化原语来着c语言,但是比c语言更加简单。
通用格式:
%v 值的默认格式表示。当输出结构体时,扩展标志(%+v)会添加字段名
%#v Go语法表示值
%T Go语法表示值的类型
%% 百分号
布尔型:
%t true或false
数值型:
%b 二进制
%c 对应的unicode码点值
%d 十进制
%o 八进制
%O 八进制带`0o`开头
%q 单引号引起来的go语法字符字面值,必要时会采用安全的转义
%x 十进制小写
%X 十进制大写
%U Unicode格式:U+1234,等价于"U+%04X"
浮点数、复数的两个组分:
%b 无小数部分、二进制指数的科学计数法,如-123456p-78
%e 科学计数法小写e, e.g. -1.234456e+78
%E 科学计数法大写e, e.g. -1.234456E+78
%f 有小数部分但无指数部分, e.g. 123.456
%F 等价%f
%g 根据实际情况采用%e或%f格式(以获得更简洁、准确的输出)
%G 根据实际情况采用%E或%F格式(以获得更简洁、准确的输出)
字符串和[]byte
%s 直接输出字符串或者[]byte
%q 双引号括起来的go语法字符串字面值
%x 每个字节用两字符十六进制数表示(小写)
%X 每个字节用两字符十六进制数表示(大写)
指针:
%p 十六进制,并加上前导的0x
浮点数:
%f 默认宽度,默认精度
%9f 宽度9,默认精度
%.2f 默认宽度,精度2
%9.2f 宽度9,精度2
%9.f 宽度9,精度0
格式化规则除了使用格式化原语,%T
和%p
之外;
对实现了特定接口的操作数会采用特定的格式化方式按应用优先级如下:
- 如果操作数实现了
Formatter
接口,会调用该接口的方法。Formatter
提供了格式化的控制。 - 如果格式化原语
%v
配合#
使用(%#v),且操作数实现了GoStringer
接口,会调用该接口。
如果操作数满足如下两条任一条,对于%s
、%q
、%v
、%x
、%X
五个格式化原语,将考虑:
3. 如果操作数实现了error
接口,Error
方法会用来生成字符串,随后将按给出的flag(如果有)和格式化原语格式化。
4. 如果操作数具有String
方法,这个方法将被用来生成字符串,然后将按给出的flag(如果有)和格式化原语格式化。
fmt包中常用的几个函数
格式化输出
func Printf(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)
格式化生产string
func Sprintf(format string, a ...interface{}) string
格式化生成error
func Errorf(format string, a ...interface{}) error
格式输入和扫描的几个函数通常在项目中比较少见。