深色模式
Go语言之格式化占位符(格式化动词 - Formatting Verbs)
常用占位符列表
占位符 | 说明 | 示例 |
---|---|---|
通用 | ||
%v | 值的默认格式表示 | fmt.Printf("%v", value) |
%+v | 结构体时,%v 的格式基础上再添加字段名 | fmt.Printf("%+v", structValue) |
%#v | 值的Go语法表示,显示详细的结构体信息 | fmt.Printf("%#v", value) |
%T | 打印值的类型 | fmt.Printf("%T", value) |
%% | 字面上的百分号% | fmt.Printf("%%") |
布尔值 | ||
%t | true 或false | fmt.Printf("%t", true) |
整数 | ||
%b | 二进制表示 | fmt.Printf("%b", 5) 输出101 |
%c | 数值对应的Unicode字符 | fmt.Printf("%c", 65) 输出A |
%d | 十进制表示(标准的整数) | fmt.Printf("%d", 123) |
%o | 八进制表示 | fmt.Printf("%o", 8) 输出10 |
%x | 十六进制表示,字母小写 | fmt.Printf("%x", 255) 输出ff |
%X | 十六进制表示,字母大写 | fmt.Printf("%X", 255) 输出FF |
%U | Unicode格式:U+1234 ,同"U+%04X" | fmt.Printf("%U", '中') 输出U+4E2D |
浮点数和复数 | ||
%b | 无小数部分的科学计数法,以二进制指数为底数 | fmt.Printf("%b", 123.456) |
%e | 科学计数法,指数为小写e | fmt.Printf("%e", 123.456) 输出1.234560e+02 |
%E | 科学计数法,指数为大写E | fmt.Printf("%E", 123.456) 输出1.234560E+02 |
%f | 有小数点而无指数 | fmt.Printf("%f", 123.456) |
%.nf | 保留n 位小数 | fmt.Printf("%.2f", 123.456) 输出123.46 |
%g | 根据实际情况采用 %e 或 %f 格式(以获得更简洁、准确的输出) | fmt.Printf("%g", 123.456) |
%G | 同%g ,但使用大写的E | fmt.Printf("%G", 123.456) |
字符串和字节切片 | ||
%s | 字符串或字节切片,不进行格式化处理 | fmt.Printf("%s", "Hello") |
%q | 双引号括起来的字符串,必要时会转义 | fmt.Printf("%q", "Hello\nWorld") 输出"Hello\nWorld" |
%x | 每个字节用两位十六进制表示,字母小写 | fmt.Printf("%x", "Hi") 输出4869 |
%X | 每个字节用两位十六进制表示,字母大写 | fmt.Printf("%X", "Hi") 输出4869 |
指针 | ||
%p | 指针的十六进制表示,前缀0x | fmt.Printf("%p", &value) |
错误 | ||
%w | 用于 错误包装,将原始错误嵌入新的错误中,保留错误链 | fmt.Errorf("发生错误: %w", originalErr) |
占位符详细说明
通用占位符
%v
:值的默认格式表示。gofmt.Printf("%v", 123) // 输出:123 fmt.Printf("%v", true) // 输出:true fmt.Printf("%v", "Hello") // 输出:Hello fmt.Printf("%v", []int{1, 2, 3}) // 输出:[1 2 3]
%+v
:在%v
的基础上,对于结构体,显示字段名。gotype Person struct { Name string Age int } p := Person{"Alice", 30} fmt.Printf("%+v", p) // 输出:{Name:Alice Age:30}
%#v
:值的Go语法表示,即输出值在Go语言中的表示方式。gofmt.Printf("%#v", p) // 输出:main.Person{Name:"Alice", Age:30}
%T
:输出值的类型。gofmt.Printf("%T", p) // 输出:main.Person
%%
:输出百分号%
本身。gofmt.Printf("完成了100%%") // 输出:完成了100%
布尔值占位符
%t
:输出true
或false
。gofmt.Printf("%t", true) // 输出:true fmt.Printf("%t", false) // 输出:false
整数占位符
%b
:二进制表示。gofmt.Printf("%b", 5) // 输出:101
%c
:对应的Unicode字符。gofmt.Printf("%c", 65) // 输出:A
%d
:十进制表示。gofmt.Printf("%d", 123) // 输出:123
%o
:八进制表示。gofmt.Printf("%o", 8) // 输出:10
%x
、%X
:十六进制表示,%x
为小写字母,%X
为大写字母。gofmt.Printf("%x", 255) // 输出:ff fmt.Printf("%X", 255) // 输出:FF
%U
:Unicode格式。gofmt.Printf("%U", '中') // 输出:U+4E2D
浮点数和复数占位符
%b
:科学计数法表示,指数为二进制,指数的底数为2。gofmt.Printf("%b", 123.456) // 输出:6946802425218990p-46
%e
、%E
:科学计数法表示,%e
指数为小写e
,%E
为大写E
。gofmt.Printf("%e", 123.456) // 输出:1.234560e+02 fmt.Printf("%E", 123.456) // 输出:1.234560E+02
%f
:有小数点的浮点数表示。gofmt.Printf("%f", 123.456) // 输出:123.456000 fmt.Printf("%.2f", 123.456) // 输出:123.46
%g
、%G
:根据实际情况选择使用%e
或%f
格式,以获得更简洁的输出。gofmt.Printf("%g", 123.456) // 输出:123.456
字符串和字节切片占位符
%s
:字符串表示。gofmt.Printf("%s", "Hello, 世界") // 输出:Hello, 世界
%q
:带双引号的字符串表示,字符串中的特殊字符会被转义。gofmt.Printf("%q", "Hello\nWorld") // 输出:"Hello\nWorld"
%x
、%X
:将字符串或字节切片每个字节用两位十六进制表示。gofmt.Printf("%x", "Hi") // 输出:4869 fmt.Printf("%X", "Hi") // 输出:4869
指针占位符
%p
:指针的十六进制表示,前缀为0x
。gofmt.Printf("%p", &p) // 输出类似:0xc0000140c0
错误占位符
%w
:用于 错误包装,将原始错误嵌入新的错误中,保留错误链。goerr := fmt.Errorf("发生错误: %w", originalErr)
宽度和精度控制
格式化占位符可以指定最小宽度和精度,以控制输出的格式。
%[flags][width][.precision][verb]
flags
:控制对齐、填充等。-
:左对齐(默认是右对齐)。0
:数字前面填充零而不是空格。
width
:最小宽度。.precision
:对于浮点数,表示小数点后的位数;对于字符串,表示最大字符数。
示例:
go
fmt.Printf("|%6d|%6d|\n", 12, 345) // 输出:| 12| 345|
fmt.Printf("|%-6d|%-6d|\n", 12, 345) // 输出:|12 |345 |
fmt.Printf("|%06d|%06d|\n", 12, 345) // 输出:|000012|000345|
fmt.Printf("|%.2f|\n", 3.1415926) // 输出:|3.14|
fmt.Printf("|%6.2f|\n", 3.1415926) // 输出:| 3.14|
fmt.Printf("|%-6.2f|\n", 3.1415926) // 输出:|3.14 |
日志打印示例
在实际的日志打印中,通常需要包含时间戳、日志级别、文件名、行号等信息,可以结合占位符来格式化输出。
示例:
go
log.Printf("[%s] %s:%d %s", "INFO", "main.go", 42, "程序启动成功")
或者使用 log
包自带的格式化功能:
go
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
log.Printf("程序启动成功")
输出类似:
2023/10/12 10:00:00 main.go:42: 程序启动成功
注意事项
类型匹配:确保占位符与对应的值类型匹配,否则可能会导致运行时错误或输出结果不符合预期。
go// 错误示例 fmt.Printf("%d", "123") // 输出:%!d(string=123)
%v
的灵活性:当不确定值的类型时,使用%v
可以安全地输出任意类型的值。调试时使用
%#v
:在调试时,使用%#v
可以显示值的完整结构,便于分析。