Skip to main content

Go 格式化动词详解

在 Go 语言中,%c%s%d%t 被称为格式化动词(Formatting Verbs)或占位符。它们主要用于 fmt 包中的打印函数(如 fmt.Printffmt.Sprintffmt.Errorf 等),用来规定数据输出的格式。

这些动词的设计很大程度上继承自 C 语言,但 Go 针对其强类型特性和特有的数据结构(如 struct、interface)做了扩展。

1. 最常用的基础动词

动词含义适用类型示例输出结果
%v通用格式,按值的默认格式输出任意Printf("%v", 10)10
%t布尔值 (true/false)boolPrintf("%t", true)true
%d十进制整数整数Printf("%d", 123)123
%s字符串或字节切片string/[]bytePrintf("%s", "hello")hello
%c字符(对应 Unicode 码点)整数/runePrintf("%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保留两位小数
布尔值%ttrue / false
字符/Rune%c把数字转成字符显示