Go 字符串格式化详解📘
Go 字符串格式化详解(String Formatting)
一、核心重点(快速掌握)
序号 | 重点内容 | 备注说明 |
---|---|---|
1 | 使用 fmt.Sprintf 构造格式化字符串 |
最常用函数之一,适用于日志、调试输出等 |
2 | 支持多种动词(verb)格式 | 如 %d , %s , %v , %T 等 |
3 | 动词支持宽度、精度、对齐控制 | 可指定最小字段宽度、浮点数精度、左对齐等 |
4 | 格式化布尔值、整数、浮点数、字符串、结构体等 | 全面覆盖基本类型和复合类型 |
5 | 使用 %v 和 %+v 输出结构体详情 |
%+v 显示字段名 |
6 | %#v 显示 Go 语法表示 |
用于调试,显示变量的完整 Go 表达式 |
7 | 浮点数可控制小数位数 | 使用 %.2f 控制精度 |
8 | 支持占位符复用 | 使用 `[数字] |
------ | -------------------------------------- | -------------------------------------------------------------------------- |
1 | 使用 fmt.Sprintf 构造格式化字符串 |
最常用函数之一,适用于日志、调试输出等 |
2 | 支持多种动词(verb)格式 | 如 %d , %s , %v , %T 等 |
3 | 动词支持宽度、精度、对齐控制 | 可指定最小字段宽度、浮点数精度、左对齐等 |
4 | 格式化布尔值、整数、浮点数、字符串、结构体等 | 全面覆盖基本类型和复合类型 |
5 | 使用 %v 和 %+v 输出结构体详情 |
%+v 显示字段名 |
6 | %#v 显示 Go 语法表示 |
用于调试,显示变量的完整 Go 表达式 |
7 | 浮点数可控制小数位数 | 使用 %.2f 控制精度 |
指定参数顺序,避免重复传参 |
二、知识点详解(专题深入)
1、格式化函数概述
Go 提供了多个格式化字符串的函数,最常用的是:
fmt.Sprintf(format string, a ...interface{}) string
fmt.Printf(format string, a ...interface{})
fmt.Fprintf(w io.Writer, format string, a ...interface{})
注意点:
- 所有格式化操作都依赖一个格式字符串(format string)和一组参数。
- 参数可以是任意类型,Go 会自动根据动词解析。
2、格式化动词(Format Verbs)
以下是 Go 中所有常用的格式化动词及其用途说明:
动词 | 类型/含义描述 |
---|---|
%v |
默认格式输出任意值。对于结构体仅输出字段值 |
%+v |
输出结构体时带字段名 |
%#v |
输出 Go 语法形式的值(如结构体字面量) |
%T |
输出值的类型信息 |
%% |
输出一个 % 符号本身 |
%t |
布尔值:true 或 false |
%d |
十进制整数(signed) |
%b |
二进制整数 |
%o |
八进制整数 |
%x |
小写十六进制整数 |
%X |
大写十六进制整数 |
%U |
Unicode 码点(如 U+263A) |
%c |
Unicode 码点对应的字符 |
%q |
带引号的字符串或字符(适合转义) |
%s |
字符串或 []byte |
%p |
指针地址(以十六进制表示) |
%e |
科学计数法(小写 e) |
%E |
科学计数法(大写 E) |
%f |
浮点数(默认六位小数) |
%g |
自动选择 %e 或 %f ,去除无意义的零 |
%G |
同 %g ,但使用大写 E |
%x (用于浮点数) |
十六进制浮点数 |
%X (用于浮点数) |
十六进制浮点数(大写) |
3、格式化选项详解(Width、Precision、Flags)
宽度(Width)
格式:%[width]v
fmt.Sprintf("%10s", "hello") // 输出: " hello"(右对齐)
精度(Precision)
格式:%.[precision]v
fmt.Sprintf("%.2f", 3.14159) // 输出: "3.14"
对齐方式(Left Align)
格式:%-[width]v
fmt.Sprintf("%-10s", "hello") // 输出: "hello "(左对齐)
正负号(Sign)
格式:%+[number]v
fmt.Sprintf("%+d", 123) // 输出: "+123"
fmt.Sprintf("% d", -123) // 输出: "-123"
零填充(Zero Padding)
格式:%0[width]v
fmt.Sprintf("%05d", 12) // 输出: "00012"
占位符复用(Index)
格式:[index]$
fmt.Sprintf("%[2]d + %[1]d = %[3]d", 1, 2, 3) // 输出: "2 + 1 = 3"
4、实例演示与横向比对
示例 1:基本数据类型格式化
package main
import (
"fmt"
)
func main() {
fmt.Println("布尔值:", fmt.Sprintf("%t", true)) // 输出: 布尔值: true
fmt.Println("十进制:", fmt.Sprintf("%d", 123)) // 输出: 十进制: 123
fmt.Println("二进制:", fmt.Sprintf("%b", 123)) // 输出: 二进制: 1111011
fmt.Println("八进制:", fmt.Sprintf("%o", 123)) // 输出: 八进制: 173
fmt.Println("十六进制:", fmt.Sprintf("%x", 123)) // 输出: 十六进制: 7b
fmt.Println("Unicode码点:", fmt.Sprintf("%U", '中')) // 输出: U+4E2D
fmt.Println("字符:", fmt.Sprintf("%c", '中')) // 输出: 中
fmt.Println("字符串:", fmt.Sprintf("%s", "你好")) // 输出: 你好
fmt.Println("指针地址:", fmt.Sprintf("%p", &main)) // 输出: 0x...
}
示例 2:结构体格式化
type Person struct {
Name string
Age int
}
p := Person{"Alice", 25}
fmt.Println("默认格式:", fmt.Sprintf("%v", p)) // 输出: {Alice 25}
fmt.Println("带字段名:", fmt.Sprintf("%+v", p)) // 输出: {Name:Alice Age:25}
fmt.Println("Go语法:", fmt.Sprintf("%#v", p)) // 输出: main.Person{Name:"Alice", Age:25}
示例 3:浮点数格式化
f := 123.456789
fmt.Println("默认浮点:", fmt.Sprintf("%f", f)) // 输出: 123.456789
fmt.Println("保留两位小数:", fmt.Sprintf("%.2f", f)) // 输出: 123.46
fmt.Println("科学记数法:", fmt.Sprintf("%e", f)) // 输出: 1.234568e+02
fmt.Println("自动选择:", fmt.Sprintf("%g", f)) // 输出: 123.457
示例 4:复杂格式组合
name := "Bob"
score := 98.76
result := fmt.Sprintf("姓名:%10s | 成绩:%6.2f", name, score)
fmt.Println(result)
// 输出: 姓名: Bob | 成绩: 98.76
5、多语言横向比对:格式化差异
特性/语言 | Go | Python | Java | C/C++ |
---|---|---|---|---|
格式化函数 | fmt.Sprintf |
str.format() / f-string |
String.format() |
sprintf() |
默认格式 | %v |
{} |
%s |
%d , %s 等 |
结构体输出 | %+v , %#v |
__repr__ , __str__ |
toString() |
不直接支持结构体 |
浮点数精度控制 | %.2f |
:.2f |
%.2f |
%.2f |
左对齐控制 | %-10s |
<10 |
-10 |
%-10s |
零填充 | %05d |
0>5 |
05d |
%05d |
指针地址输出 | %p |
id(x) |
System.identityHashCode() |
%p |
占位符复用 | `[1] | 特性/语言 | Go | Python |
---------------- | ------------------------------ | -------------------------------- | ------------------------------- | ---------------------------- |
格式化函数 | fmt.Sprintf |
str.format() / f-string |
String.format() |
sprintf() |
默认格式 | %v |
{} |
%s |
%d , %s 等 |
结构体输出 | %+v , %#v |
__repr__ , __str__ |
toString() |
不直接支持结构体 |
浮点数精度控制 | %.2f |
:.2f |
%.2f |
%.2f |
左对齐控制 | %-10s |
<10 |
-10 |
%-10s |
零填充 | %05d |
0>5 |
05d |
%05d |
指针地址输出 | %p |
id(x) |
System.identityHashCode() |
%p |
\| `{0}` \| `%1$d` | 不支持 |
✅ 总结
本章系统讲解了 Go 语言中字符串格式化的全部动词和格式化选项,涵盖以下内容:
- 格式化函数家族(Sprintf、Printf、Fprintf)
- 所有格式化动词(%v、%s、%d、%f、%t、%p、%T、%#v、%+v 等)
- 格式化选项(宽度、精度、对齐、符号、零填充等)
- 实例代码展示各类格式化技巧
- 多语言横向比对(Go vs Python、Java、C/C++)
- 注意事项与最佳实践(如结构体打印、浮点数精度处理等)
掌握这些格式化动词和技巧,将极大提升你在日志记录、调试输出、数据展示等方面的开发效率。
如需继续学习数组、切片、映射等结构,请继续提问。