go语言中格式化字符串依赖fmt包,核心函数为fmt.Sprintf、printf和Fprintf,使用动词如%s、%d控制输出形式;%v用于默认格式,%+v显示结构体字段名,%#v生成Go语法字面量,%d、%x、%X分别输出十进制和十六进制整数,%s输出字符串,%q带引号并转义,%f、%e、%g控制浮点数精度;修饰符如宽度6、精度.2和标志0、+、-可组合成%6.2f、%-10s、%08d等,提升对齐与可读性;推荐用%+v打印结构体以增强调试信息,或实现String()方法自定义输出;禁止将用户输入作为格式字符串,防止panic或信息泄露,应使用固定格式如”User: %s”配合参数传入,确保安全。

Go 语言中格式化字符串主要靠 fmt 包,核心是 fmt.Sprintf、fmt.Printf 和 fmt.Fprintf 这三个函数,语法简洁统一,但细节决定是否写得清晰又安全。
基础动词(verbs)怎么选
动词控制值的输出形式,写在 % 后面,比如 %s、%d。常用且实用的有:
-
%v:默认格式,适合调试,自动适配类型(如结构体打印字段名+值) -
%+v:结构体时显示字段名,比%v更清晰 -
%#v:输出 Go 语法风格的字面量(比如Struct{A int}{A:1}),方便复制回代码 -
%d:十进制整数;%x十六进制小写;%X大写 -
%s:字符串;%q带双引号并转义("hellon");%x字符串按字节十六进制输出 -
%f、%e、%g:浮点数不同表示法,%.2f可控制小数位数
宽度、精度和标志这些修饰符怎么用
它们紧贴动词前,构成完整格式符,例如 %6.2f、%-10s、%08d:
- 数字
6是最小宽度:不足则补空格(左对齐加-,右对齐默认) -
.2是精度:对浮点数是小数位数,对字符串是最大输出长度(%.3s截取前 3 字符) -
0标志用于数字,表示用0填充而非空格(%04d输出0042) -
+强制显示正负号(%+d输出+42) -
(空格)标志:正数前加空格,负数前加-,对齐时有用
结构化格式推荐用结构体字段名 + %+v 或 fmt.Stringer
直接打印结构体别只用 %v,容易漏字段或难读:
立即学习“go语言免费学习笔记(深入)”;
- 用
%+v看字段名和值,适合日志或调试:fmt.Printf("%+v", user) - 若要自定义输出(比如隐藏密码字段、美化时间),让类型实现
String() string方法,fmt会自动调用它 - 避免手动拼接字符串(如
"name:" + u.Name + ", age:" + strconv.Itoa(u.Age)),既啰嗦又易错
安全提示:别用用户输入当格式字符串
fmt.Printf(userInput, args...) 是严重安全隐患——如果 userInput 含 %s 或 %d,可能触发 panic 或信息泄露:
- 永远用固定格式字符串:
fmt.Printf("User: %s, ID: %d", name, id) - 需要动态拼格式?先用
fmt.Sprintf构造好再传给fmt.Print*,不把变量放第一个参数位置 - 日志库(如
log或zap)也同理,别把用户数据当格式模板
基本上就这些。fmt 不复杂但容易忽略修饰符细节,用熟几个常用组合(比如 %+v、%02d、%q)就能覆盖大多数场景。