跳过正文
  1. Teches/
  2. 程序语言/
  3. golang/

fmt格式化动词表

·549 字·3 分钟
目录

通用格式化:
#

动词描述示例
%v值的默认格式fmt.Printf("%v", 42)42
%#vGo语法表示fmt.Printf("%#v", "hello")"hello"
%T值的类型fmt.Printf("%T", 3.14)float64
%%字面百分号fmt.Printf("%%")%

布尔类型:
#

动词描述示例
%ttrue 或 falsefmt.Printf("%t", true)true

整数类型:
#

动词描述示例
%b二进制fmt.Printf("%b", 5)101
%cUnicode字符fmt.Printf("%c", 65)A
%d十进制fmt.Printf("%d", 42)42
%o八进制fmt.Printf("%o", 8)10
%O带0o前缀的八进制fmt.Printf("%O", 8)0o10
%x十六进制(小写)fmt.Printf("%x", 255)ff
%X十六进制(大写)fmt.Printf("%X", 255)FF
%UUnicode格式fmt.Printf("%U", 'A')U+0041
%q单引号字符fmt.Printf("%q", 65)'A'

浮点数:
#

动词描述示例
%f十进制浮点数fmt.Printf("%f", 3.1415)3.141500
%e科学计数法(e)fmt.Printf("%e", 1000.0)1.000000e+03
%E科学计数法(E)fmt.Printf("%E", 1000.0)1.000000E+03
%g自动选择 %e 或 %ffmt.Printf("%g", 3.1415)3.1415
%G自动选择 %E 或 %ffmt.Printf("%G", 3.1415)3.1415

字符串和字节切片:
#

动词描述示例
%s普通字符串fmt.Printf("%s", "hello")hello
%q双引号字符串fmt.Printf("%q", "hello")"hello"
%x十六进制(小写)fmt.Printf("%x", "Go")476f
%X十六进制(大写)fmt.Printf("%X", "Go")476F

指针:
#

动词描述示例
%p十六进制指针地址fmt.Printf("%p", &x)0xc0000120a0

宽度和精度控制:
#

</> go
 1// 宽度:最小字段宽度
 2fmt.Printf("|%6d|%6d|\n", 123, 45)      // |   123|    45|
 3
 4// 精度:小数点后位数(浮点数)
 5fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.456) // |  1.20|  3.46|
 6
 7// 宽度和精度结合
 8fmt.Printf("|%8s|%8s|\n", "foo", "barbaz") // |     foo|  barbaz|
 9
10// 左对齐
11fmt.Printf("|%-6d|%-6d|\n", 123, 45)    // |123   |45    |
12
13// 始终显示符号
14fmt.Printf("|%+6d|%+6d|\n", 123, -45)   // |  +123|   -45|
15
16// 填充0而不是空格
17fmt.Printf("|%06d|%06d|\n", 123, 45)    // |000123|000045|
18
19// 空格占位符
20fmt.Printf("|% d|% d|\n", 123, -45)     // | 123|-45|

复杂示例:
#

</> go
 1package main
 2
 3import "fmt"
 4
 5type Person struct {
 6    Name string
 7    Age  int
 8}
 9
10func main() {
11    // 结构体格式化
12    p := Person{"Alice", 30}
13    fmt.Printf("%v\n", p)   // {Alice 30}
14    fmt.Printf("%+v\n", p)  // {Name:Alice Age:30}
15    fmt.Printf("%#v\n", p)  // main.Person{Name:"Alice", Age:30}
16    
17    // 切片和数组
18    arr := [3]int{1, 2, 3}
19    slice := []int{1, 2, 3}
20    fmt.Printf("%v\n", arr)    // [1 2 3]
21    fmt.Printf("%#v\n", arr)   // [3]int{1, 2, 3}
22    fmt.Printf("%#v\n", slice) // []int{1, 2, 3}
23    
24    // 指针
25    x := 42
26    ptr := &x
27    fmt.Printf("%p\n", ptr)    // 0xc0000120a0
28    fmt.Printf("%v\n", ptr)    // 0xc0000120a0
29    fmt.Printf("%T\n", ptr)    // *int
30    
31    // 多种类型混合
32    fmt.Printf("Name: %s, Age: %d, Score: %.2f\n", "Bob", 25, 95.5)
33    // Name: Bob, Age: 25, Score: 95.50
34    
35    // 十六进制查看内存
36    data := []byte{0x48, 0x65, 0x6c, 0x6c, 0x6f}
37    fmt.Printf("% x\n", data)  // 48 65 6c 6c 6f
38    fmt.Printf("%X\n", data)   // 48656C6C6F
39}

特殊技巧:
#

</> go
 1// 1. 索引引用参数(重复使用)
 2fmt.Printf("%[2]d %[1]d %[2]d\n", 1, 2)  // 2 1 2
 3
 4// 2. 切片格式化
 5s := []int{1, 2, 3, 4, 5}
 6fmt.Printf("%v\n", s)       // [1 2 3 4 5]
 7fmt.Printf("%#v\n", s)      // []int{1, 2, 3, 4, 5}
 8
 9// 3. 映射格式化
10m := map[string]int{"a": 1, "b": 2}
11fmt.Printf("%v\n", m)       // map[a:1 b:2]
12fmt.Printf("%#v\n", m)      // map[string]int{"a":1, "b":2}
13
14// 4. 自定义类型的 String() 方法
15type MyType int
16func (m MyType) String() string {
17    return fmt.Sprintf("MyType(%d)", m)
18}
19var mt MyType = 42
20fmt.Printf("%v\n", mt)      // MyType(42)

常用组合:
#

</> go
1// 调试信息常用
2fmt.Printf("变量: %#v, 类型: %T, 地址: %p\n", var, var, &var)
3
4// 表格输出
5fmt.Printf("|%-10s|%10d|%10.2f|\n", "Alice", 30, 95.5)
6fmt.Printf("|%-10s|%10d|%10.2f|\n", "Bob", 25, 88.75)
7
8// 进度条样式
9fmt.Printf("\r进度: [%-50s] %d%%", strings.Repeat("=", 25), 50)