深色模式
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可以显示值的完整结构,便于分析。
