本文最后更新于 2025-07-25,文章内容可能已经过时。

以下是 Golang 中用于格式化输出的常用数据类型及其对应的格式化符号(占位符)的总结:


通用占位符

符号说明
%v默认格式输出任意值(最常用)。
%+v输出结构体时显示字段名(如 {Name:Alice Age:30})。
%#v以 Go 语法表示值(如 main.User{Name:"Alice", Age:30})。
%T输出值的类型(如 stringint)。
%%输出字面量 %(转义符号)。

布尔类型

符号说明
%t输出 truefalse

整数类型

符号说明
%b二进制表示(如 1010)。
%c对应的 Unicode 字符(如 %c 输出 A,对应 ASCII 值 65)。
%d十进制表示(如 10)。
%o八进制表示(如 12)。
%O带前缀的八进制(如 0o12)。
%q单引号包裹的字符字面量(如 'A')。
%x十六进制(小写 a-f,如 ff)。
%X十六进制(大写 A-F,如 FF)。
%UUnicode 格式(如 U+0041)。

浮点数和复数

符号说明
%b无小数部分的科学计数法(如 -123456p-78)。
%e科学计数法(小写 e,如 1.234456e+07)。
%E科学计数法(大写 E,如 1.234456E+07)。
%f十进制形式(无指数部分,如 123.456)。
%F%f
%g自动选择 %e%f(更简洁的表示)。
%G自动选择 %E%F(更简洁的表示)。
%x十六进制科学计数法(如 -0x1.23abcp+20)。
%X十六进制科学计数法(大写,如 -0X1.23ABCP+20)。

字符串和字节切片

符号说明
%s直接输出字符串(如 Hello)。
%q双引号包裹的字符串(如 "Hello")。
%x每个字节以十六进制表示(小写,如 48656c6c6f)。
%X每个字节以十六进制表示(大写,如 48656C6C6F)。

指针

符号说明
%p以十六进制输出指针地址(如 0xc00001a200)。
%#p以 Go 语法表示指针(如 0x1300,无前导 0x)。

宽度和精度控制

  1. 宽度(最小字符数):%5d 表示至少占 5 位,不足补空格。
  2. 精度(小数位数或字符串最大长度):
    • 浮点数:%.2f 表示保留两位小数。
    • 字符串:%.5s 表示截取前 5 个字符。
  3. 组合使用%8.2f 表示总宽度 8,保留两位小数。

对齐与填充

修饰符说明
-左对齐(如 %-10s 表示左对齐,占 10 位)。
00 填充(如 %05d 表示不足 5 位用 0 补足)。
空格填充(默认)。

示例

package main

import (
	"fmt"
)

func main() {
	// ============ 通用占位符 =============
	fmt.Println("=== 通用占位符 ===")
	a := 42
	b := "Hello"
	c := true
	d := User{"Alice", 30}

	fmt.Printf("%%v: %v\n", a)   // 默认格式: 42
	fmt.Printf("%%+v: %+v\n", d) // 显示字段名: {Name:Alice Age:30}
	fmt.Printf("%%#v: %#v\n", d) // Go 语法表示: main.User{Name:"Alice", Age:30}
	fmt.Printf("%%T: %T\n", b)   // 类型: string
	fmt.Printf("%%%%: %%\n")     // 输出 %

	// ============ 布尔类型 =============
	fmt.Println("\n=== 布尔类型 ===")
	fmt.Printf("%%t: %t\n", c) // true 或 false

	// ============ 整数类型 =============
	fmt.Println("\n=== 整数类型 ===")
	i := 10

	fmt.Printf("%%b: %b\n", i)   // 二进制: 1010
	fmt.Printf("%%c: %c\n", 65)  // Unicode 字符: A
	fmt.Printf("%%d: %d\n", i)   // 十进制: 10
	fmt.Printf("%%o: %o\n", i)   // 八进制: 12
	fmt.Printf("%%O: %O\n", i)   // 八进制带前缀: 0o12
	fmt.Printf("%%q: %q\n", 'A') // 单引号字符: 'A'
	fmt.Printf("%%x: %x\n", i)   // 十六进制小写: a
	fmt.Printf("%%X: %X\n", i)   // 十六进制大写: A
	fmt.Printf("%%U: %U\n", 'A') // Unicode 格式: U+0041

	// ============ 浮点数和复数 =============
	fmt.Println("\n=== 浮点数和复数 ===")
	f := 123.456

	fmt.Printf("%%b: %b\n", f) // 科学计数法无小数: 8687443681197687p-46
	fmt.Printf("%%e: %e\n", f) // 科学计数法小写 e: 1.234560e+02
	fmt.Printf("%%E: %E\n", f) // 科学计数法大写 E: 1.234560E+02
	fmt.Printf("%%f: %f\n", f) // 十进制形式: 123.456000
	fmt.Printf("%%F: %F\n", f) // 同 %f
	fmt.Printf("%%g: %g\n", f) // 自动选择 e/f: 123.456
	fmt.Printf("%%G: %G\n", f) // 自动选择 E/F: 123.456
	fmt.Printf("%%x: %x\n", f) // 十六进制科学计数法: 0x1.edd2f1a9fbe77p+06
	fmt.Printf("%%X: %X\n", f) // 十六进制科学计数法大写: 0X1.EDD2F1A9FBE77P+06

	// ============ 字符串和字节切片 =============
	fmt.Println("\n=== 字符串和字节切片 ===")
	s := "Hello"

	fmt.Printf("%%s: %s\n", s) // 字符串: Hello
	fmt.Printf("%%q: %q\n", s) // 双引号字符串: "Hello"
	fmt.Printf("%%x: %x\n", s) // 十六进制字节表示: 48656c6c6f
	fmt.Printf("%%X: %X\n", s) // 大写十六进制字节: 48656C6C6F

	// ============ 指针 =============
	fmt.Println("\n=== 指针 ===")
	var p *int = &i

	fmt.Printf("%%p: %p\n", p)   // 指针地址: 0xc00001a200
	fmt.Printf("%%#p: %#p\n", p) // Go 表示法: 0x1300

	// ============ 宽度与精度控制 =============
	fmt.Println("\n=== 宽度与精度 ===")
	fmt.Printf("%5d\n", 10)             // 宽度5:    10
	fmt.Printf("%.2f\n", 3.1415)        // 精度2: 3.14
	fmt.Printf("%8.2f\n", 3.1415)       // 宽度8精度2:     3.14
	fmt.Printf("%.5s\n", "Hello World") // 截取前5字符: Hello
	fmt.Printf("%-10s\n", "Hi")         // 左对齐: Hi
	fmt.Printf("%05d\n", 10)            // 填充0: 00010
}

type User struct {
	Name string
	Age  int
}

//输出结果
=== 通用占位符 ===
%v: 42
%+v: {Name:Alice Age:30}
%#v: main.User{Name:"Alice", Age:30}
%T: string
%%: %

=== 布尔类型 ===
%t: true

=== 整数类型 ===
%b: 1010
%c: A
%d: 10
%o: 12
%O: 0o12
%q: 'A'
%x: a
%X: A
%U: U+0041

=== 浮点数和复数 ===
%b: -123456p-78
%e: 1.234560e+02
%E: 1.234560E+02
%f: 123.456000
%F: 123.456000
%g: 123.456
%G: 123.456
%x: -0x1.8d9d9d9d9d9dap+6
%X: -0X1.8D9D9D9D9D9DAP+6

=== 字符串和字节切片 ===
%s: Hello
%q: "Hello"
%x: 48656c6c6f
%X: 48656C6C6F

=== 指针 ===
%p: 0xc00001a200
%#p: 0x1300

=== 宽度与精度 ===
   10
3.14
    3.14
Hello
Hi        
00010

说明

  • 每个格式符都在 fmt.Printf 中使用 % 开头。
  • 指针地址可能因运行环境不同而变化。
  • %-10s 用于左对齐,%05d 用于填充零。
  • %.5s 用于截取字符串前 5 个字符。

注意事项

  1. 转义 %:如果需要输出字面量 %,使用 %%(如 fmt.Printf("百分比: %%"))。
  2. 结构体字段名:只有使用 %+v%#v 时才会显示结构体字段名。
  3. 宽度和精度优先级:宽度和精度可以单独或组合使用,但需注意顺序(如 %8.2f 是合法的)。