Go 格式化动词详解
在 Go 语言中,%c、%s、%d、%t 被称为格式化动词(Formatting Verbs)或占位符。它们主要用于 fmt 包中的打印函数(如 fmt.Printf、fmt.Sprintf、fmt.Errorf 等),用来规定数据输出的格式。
这些动词的设计很大程度上继承自 C 语言,但 Go 针对其强类型特性和特有的数据结构(如 struct、interface)做了扩展。
1. 最常用的基础动词
| 动词 | 含义 | 适用类型 | 示例 | 输出结果 |
|---|---|---|---|---|
%v | 通用格式,按值的默认格式输出 | 任意 | Printf("%v", 10) | 10 |
%t | 布尔值 (true/false) | bool | Printf("%t", true) | true |
%d | 十进制整数 | 整数 | Printf("%d", 123) | 123 |
%s | 字符串或字节切片 | string/[]byte | Printf("%s", "hello") | hello |
%c | 字符(对应 Unicode 码点) | 整数/rune | Printf("%c", 65) | A |
2. 详细分类
A. 通用动词(调试神器)
Go 语言特有的一组动词,非常适合调试复杂的数据结构(如结构体、Map)。
%v: 值的默认格式%+v: 打印结构体时,会添加字段名(非常实用)%#v: 打印值的 Go 语法表示(即你可以直接把输出结果拷贝回代码中使用)%T: 打印值的类型
type User struct {
Name string
Age int
}
u := User{Name: "Alice", Age: 30}
fmt.Printf("%v\n", u) // {Alice 30}
fmt.Printf("%+v\n", u) // {Name:Alice Age:30} <-- 推荐用于日志
fmt.Printf("%#v\n", u) // main.User{Name:"Alice", Age:30} <-- 推荐用于调试
fmt.Printf("%T\n", u) // main.User
B. 整数(Integer)
%d: 十进制 (Base 10)%b: 二进制 (Base 2)%o: 八进制 (Base 8)%x: 十六进制 (Base 16),使用小写 a-f%X: 十六进制 (Base 16),使用大写 A-F%q: 该值对应的单引号字符字面量(安全转义)
n := 65
fmt.Printf("%d", n) // 65
fmt.Printf("%b", n) // 1000001
fmt.Printf("%x", n) // 41
fmt.Printf("%c", n) // A
fmt.Printf("%q", n) // 'A'
C. 浮点数与复数(Float & Complex)
%f: 有小数点而无指数,例如123.456%.2f: 常用,控制小数点后保留两位%e: 科学计数法,例如1.234560e+02%g: 根据情况自动选择%e或%f以产生更紧凑的输出
f := 12.3456
fmt.Printf("%f\n", f) // 12.345600 (默认精度)
fmt.Printf("%.2f\n", f) // 12.35 (四舍五入)
D. 字符串与字节切片(String & []byte)
%s: 直接输出字符串内容%q: 双引号括起来的字符串(会对特殊字符进行转 义),例如"Hello\tWorld"%x: 每个字节用两个十六进制字符表示(用于打印二进制数据流)
s := "Hi\tGo"
fmt.Printf("%s\n", s) // Hi Go (中间有制表符)
fmt.Printf("%q\n", s) // "Hi\tGo" (带引号,看见了转义符)
E. 指针(Pointer)
%p: 十六进制表示,前缀为0x
x := 10
p := &x
fmt.Printf("%p\n", p) // 0xc0000160b8
3. 宽度与精度控制(Flags)
你可以在 % 和动词之间添加修饰符来控制对齐和补零。
%9d: 宽度为 9,默认右对齐(左边补空格)%-9d: 宽度为 9,左对齐(右边补空格)%09d: 宽度为 9,不足补 0
fmt.Printf("|%5d|", 12) // | 12|
fmt.Printf("|%-5d|", 12) // |12 |
fmt.Printf("|%05d|", 12) // |00012|
总结速查表
| 场景 | 推荐动词 | 备注 |
|---|---|---|
| 不知道用什么 | %v | 万能占位符 |
| 打印日志/结构体 | %+v | 能看到字段名,信息更全 |
| 字符串 | %s | 正常文本 |
| 数字 | %d | 正常整数 |
| 保留小数 | %.2f | 保留两位小数 |
| 布尔值 | %t | true / false |
| 字符/Rune | %c | 把数字转成字符显示 |