golang-基础-Go语言格式化输出的常用数据类型及其对应的格式化符号
本文最后更新于 2025-07-25,文章内容可能已经过时。
以下是 Golang 中用于格式化输出的常用数据类型及其对应的格式化符号(占位符)的总结:
通用占位符
符号 | 说明 |
---|---|
%v | 默认格式输出任意值(最常用)。 |
%+v | 输出结构体时显示字段名(如 {Name:Alice Age:30} )。 |
%#v | 以 Go 语法表示值(如 main.User{Name:"Alice", Age:30} )。 |
%T | 输出值的类型(如 string 、int )。 |
%% | 输出字面量 % (转义符号)。 |
布尔类型
符号 | 说明 |
---|---|
%t | 输出 true 或 false 。 |
整数类型
符号 | 说明 |
---|---|
%b | 二进制表示(如 1010 )。 |
%c | 对应的 Unicode 字符(如 %c 输出 A ,对应 ASCII 值 65)。 |
%d | 十进制表示(如 10 )。 |
%o | 八进制表示(如 12 )。 |
%O | 带前缀的八进制(如 0o12 )。 |
%q | 单引号包裹的字符字面量(如 'A' )。 |
%x | 十六进制(小写 a-f ,如 ff )。 |
%X | 十六进制(大写 A-F ,如 FF )。 |
%U | Unicode 格式(如 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 )。 |
宽度和精度控制
- 宽度(最小字符数):
%5d
表示至少占 5 位,不足补空格。 - 精度(小数位数或字符串最大长度):
- 浮点数:
%.2f
表示保留两位小数。 - 字符串:
%.5s
表示截取前 5 个字符。
- 浮点数:
- 组合使用:
%8.2f
表示总宽度 8,保留两位小数。
对齐与填充
修饰符 | 说明 |
---|---|
- | 左对齐(如 %-10s 表示左对齐,占 10 位)。 |
0 | 用 0 填充(如 %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 个字符。
注意事项
- 转义
%
:如果需要输出字面量%
,使用%%
(如fmt.Printf("百分比: %%")
)。 - 结构体字段名:只有使用
%+v
或%#v
时才会显示结构体字段名。 - 宽度和精度优先级:宽度和精度可以单独或组合使用,但需注意顺序(如
%8.2f
是合法的)。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 软件从业者Hort
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果