在 Go 语言中经常使用 fmt.Sprintf 进行字符串格式化,除了比较常用的 %v 或 %s 外,还有一些其它占位符可以使用,本文主要介绍可用的占位符便于使用时进行速查。
| 占位符 | 说明 | 示例输出 |
|---|---|---|
%v | 默认格式输出 | fmt.Sprintf("%v", 123) → "123" |
%+v | 结构体字段名和值 | {Name:Tom Age:18} |
%#v | Go语法表示(带类型) | main.User{Name:"Tom", Age:18} |
%T | 输出类型 | "int" |
%% | 输出字面百分号 % | "100%" |
| 占位符 | 含义 | 示例 |
|---|---|---|
%d | 十进制整数 | 123 |
%b | 二进制表示 | 1111011 |
%o | 八进制 | 173 |
%x | 十六进制(小写) | 7b |
%X | 十六进制(大写) | 7B |
%c | 输出 Unicode 字符 | 'A' |
%U | Unicode 编码形式 | U+0041 |
| 占位符 | 说明 | 示例输出 |
|---|---|---|
%f | 小数(默认6位) | 3.141593 |
%.2f | 保留2位小数 | 3.14 |
%e | 科学计数法(小写e) | 3.141593e+00 |
%E | 科学计数法(大写E) | 3.141593E+00 |
%g | 自动选择 %f 或 %e | 3.14 |
| 占位符 | 说明 | 示例输出 |
|---|---|---|
%s | 普通字符串 | "hello" |
%q | 带引号字符串(含转义) | "\"hello\"" |
%x | 十六进制(每字节两位) | "68656c6c6f" |
% X | 十六进制并以空格分隔 | "68 65 6C 6C 6F" |
| 占位符 | 含义 | 示例输出 |
|---|---|---|
%p | 指针地址(十六进制) | 0xc0000100a8 |
| 格式 | 含义 | 示例 |
|---|---|---|
%6d | 宽度6,右对齐 | " 123" |
%-6d | 宽度6,左对齐 | "123 " |
%06d | 左补零 | "000123" |
%10.2f | 总宽度10,小数2位 | " 12.34" |
%w 是 Go 错误系统的关键改进。它允许在 fmt.Errorf 中包装底层错误,从而让上层错误保留原始信息。
示例:
gobaseErr := errors.New("数据库连接失败")
err := fmt.Errorf("请求处理失败: %w", baseErr)
if errors.Is(err, baseErr) {
fmt.Println("底层错误匹配成功")
}
输出:
请求处理失败: 数据库连接失败 底层错误匹配成功
注意
注意:一个 fmt.Errorf 调用中 只能包含一个 %w。
| 场景 | 推荐格式 | 说明 |
|---|---|---|
| 输出简单信息 | %v | 常规错误描述 |
| 输出结构体字段 | %+v | 调试模式 |
| 打印类型信息 | %T | 动态类型检查 |
| 打印内存地址 | %p | 诊断指针问题 |
| 包装底层错误 | %w | Go 错误链机制 |
| 分类 | 占位符 | 含义 |
|---|---|---|
| 通用 | %v, %+v, %#v, %T, %% | 值、类型、Go 表示、百分号 |
| 整数 | %d, %x, %o, %b, %c | 十进制、十六进制、八进制、二进制、字符 |
| 浮点 | %f, %e, %E, %g | 小数、科学计数法 |
| 字符串 | %s, %q, %x, % X | 普通、带引号、十六进制 |
| 指针 | %p | 地址 |
| 错误包装 | %w | 包装底层错误(仅限 fmt.Errorf) |


本文作者:蒋固金
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!