字符串格式化可以帮助我们节省时间,解决复杂任务
例如,如果我们需要把十进制数 100000 的十六进制值打印到控制台(它的十六进制是 186a0 ),通常我们不会手动去计算并输入这个值。
我们可以使用 字符串格式化 来更方便地完成这个任务。
在本节中,我们将学习如何在 Go 中使用字符串格式化。总体来说,有两种方式:
-
使用
Printf()函数直接打印格式化字符串 -
使用
Sprintf()函数格式化并返回字符串,而不是直接打印
这两种方法都位于 fmt 包中。
fmt.Printf() 简介
fmt.Printf() 至少接受一个参数。最简单的用法是把它当作 fmt.Print() 的替代品:
go
fmt.Printf("kitty1\nkitty2")
fmt.Printf("\n")
fmt.Printf("kitty1\tkitty2")
输出结果:
go
kitty1
kitty2
kitty1 kitty2
代码说明
-
\n表示换行 -
\t表示制表符(Tab) -
Printf会解析这些转义字符
使用格式化模板
在大多数情况下,我们会给 fmt.Printf() 传入 两个或更多参数:
-
第一个参数:字符串模板(包含普通文本和格式化动词)
-
后续参数:用于替换模板中格式化动词的变量
示例:
go
s := "Golang"
a := "young"
fmt.Printf("We are %s hackers, we are so %s", s, a)
输出:
go
We are Golang hackers, we are so young
代码说明
-
%s是字符串格式化动词 -
按顺序用
s和a的值替换%s
注意:fmt 包中以
f结尾的函数通常都支持格式化字符串功能。
使用不同的格式化动词
数值格式化
go
fmt.Printf("%d", 36)
输出:
go
36
%d用于打印整数(int)
浮点数格式化
go
fmt.Printf("%f", 20.66)
输出:
go
20.660000
go
fmt.Printf("%.1f", 20.33)
输出:
go
20.3
代码说明
-
%f用于浮点数 -
.1表示保留 1 位小数 -
若不指定精度,Go 使用默认精度(6 位小数)
字符、字符串和布尔值
go
letter := 't'
fmt.Printf("%c", letter) // t
secret := '🤫'
fmt.Printf("%c", secret) // 🤫
%c用于单个字符(包括 Unicode 字符)
go
fmt.Printf("%s", "This is a random string")
%s用于字符串
go
fmt.Printf("%t", false)
%t用于布尔值
设置字符串宽度
go
fmt.Printf("|%8s|", "pikachu")
输出:
go
| pikachu|
代码说明
-
%8s表示字符串总宽度为 8 -
如果字符串长度不足,会在左侧补空格
输出百分号 %
go
fmt.Printf("%%")
输出:
go
%
显式参数索引(调整顺序或重复使用)
有时我们希望:
-
多次使用同一个变量
-
调整变量的输出顺序
可以使用 方括号 [] 指定参数索引:
go
a := "First variable"
b := "Second variable"
fmt.Printf("%[1]s | %[1]s \n", a)
fmt.Printf("%[2]s | %[1]s", a, b)
输出:
go
First variable | First variable
Second variable | First variable
代码说明
-
%[1]s表示使用第 1 个参数 -
%[2]s表示使用第 2 个参数 -
索引从 1 开始
默认动词 %v
%v 是 默认格式化动词,非常通用。
当你不知道该用哪个动词时,可以直接用 %v
go
fmt.Printf("%v", '😄') // 128516(Unicode 编码)
fmt.Printf("%v", "世界") // 世界
fmt.Printf("%v", []int{1,2,3,4,5,6}) // [1 2 3 4 5 6]
fmt.Printf("%v", [3]int{9,8,7}) // [9 8 7]
fmt.Printf("%v", 1+5i) // 1+5i
说明
-
%v可以打印:-
Unicode 字符的数值
-
数组、切片
-
复数
-
各种复杂类型
-
fmt 包中的其他函数
Sprintf()
Sprintf() 不会打印 ,而是返回格式化后的字符串:
go
first := fmt.Sprintf("%d", 500)
binaryVariable := fmt.Sprintf("%b", 500)
结果:
-
first="500" -
binaryVariable="111110100"
Print / Sprint / Println / Sprintln
-
Print()/Sprint()使用默认动词%v -
S 开头:返回字符串
-
ln 结尾 :自动添加换行符
\n
Print 示例:
go
fmt.Print("Hello")
x := "World"
fmt.Print("Hello, ", x)
输出:
go
HelloHello, World
Sprintln 示例:
go
s := fmt.Sprintln(
"if you try to print s,",
"it will automatically print a new line at the end of the string",
)
fmt.Print(s, "Newline")
输出:
go
if you try to print s, it will automatically print a new line at the end of the string
Newline
使用反引号格式化多行字符串(原始字符串)
Go 支持 原始字符串字面量 ,使用反引号 ... 包裹:
go
fmt.Printf(`%s
and
the
brave
new\n
world\n`, "Go")
输出:
go
Go
and
the
brave
new\n
world\n
说明
-
反引号中的内容 不会解析转义字符
-
\n会被原样输出
总结
在本节中,我们学习了:
-
Go 使用
fmt包进行字符串格式化 -
Printf()和Sprintf()的区别 -
常用格式化动词(
%d、%f、%s、%v等) -
参数索引
%[n] -
Print / Println / Sprint / Sprintln -
使用反引号编写多行字符串
在实际开发中,正确地格式化字符串可以让代码更加整洁、可读性更强。