Golang fmt.Sprintf 函数
最后修改时间 2025 年 5 月 8 日
本教程解释了如何在 Go 中使用 fmt.Sprintf 函数。我们将通过常见用例的实际示例涵盖字符串格式化的基础知识。
fmt.Sprintf 函数在 Go 中格式化字符串但不打印它们。它返回一个格式化后的字符串,而不是写入标准输出。这对于创建具有动态内容的字符串非常有用。
在 Go 中,fmt.Sprintf 使用与 C 的 printf 类似的格式动词。它支持各种数据类型和格式化选项。该函数是 Go 的 fmt 包的一部分,该包处理 I/O 格式化。
基本字符串格式化
fmt.Sprintf 最简单的用法是将静态文本与变量结合起来。此示例演示了不同数据类型的基本字符串格式化。
注意: %s 和 %d 等格式动词指定如何格式化值。
package main
import (
"fmt"
)
func main() {
name := "Alice"
age := 28
height := 1.72
result := fmt.Sprintf("%s is %d years old and %.2f meters tall",
name, age, height)
fmt.Println(result)
}
格式字符串包含将被变量值替换的动词。%s 格式化字符串,%d 格式化整数,%.2f 将浮点数格式化为 2 位小数。
整数格式化选项
fmt.Sprintf 为整数格式化提供了各种选项。此示例显示了不同的基数表示和填充选项。
package main
import "fmt"
func main() {
num := 42
dec := fmt.Sprintf("Decimal: %d", num)
hex := fmt.Sprintf("Hexadecimal: %x", num)
oct := fmt.Sprintf("Octal: %o", num)
bin := fmt.Sprintf("Binary: %b", num)
pad := fmt.Sprintf("Padded: %04d", num)
fmt.Println(dec)
fmt.Println(hex)
fmt.Println(oct)
fmt.Println(bin)
fmt.Println(pad)
}
不同的格式动词以各种基数显示数字。%04d 用零填充数字以确保 4 位宽度。这对于一致的格式很有用。
浮点数精度
浮点数可以以特定的精度格式化。此示例演示了如何控制小数位数和科学计数法。
package main
import "fmt"
func main() {
pi := 3.1415926535
defaultFmt := fmt.Sprintf("Default: %f", pi)
twoDec := fmt.Sprintf("Two decimals: %.2f", pi)
sciNot := fmt.Sprintf("Scientific: %e", pi)
largeNum := fmt.Sprintf("Large: %g", 123456789.123456789)
fmt.Println(defaultFmt)
fmt.Println(twoDec)
fmt.Println(sciNot)
fmt.Println(largeNum)
}
%.2f 将输出限制为 2 位小数。%e 使用科学计数法,而 %g 根据值自动在十进制和科学计数法之间进行选择。
字符串和字符格式化
fmt.Sprintf 为字符串和字符提供了专门的格式化。此示例展示了宽度控制、引号和 Unicode 处理。
package main
import "fmt"
func main() {
str := "hello"
char := '世'
padded := fmt.Sprintf("Padded: %10s", str)
quoted := fmt.Sprintf("Quoted: %q", str)
unicode := fmt.Sprintf("Character: %U", char)
charRep := fmt.Sprintf("Char: %c", char)
fmt.Println(padded)
fmt.Println(quoted)
fmt.Println(unicode)
fmt.Println(charRep)
}
%10s 将字符串右填充空格至 10 个字符。%q 在字符串周围添加引号。%U 显示 Unicode 代码点,%c 显示实际字符。
布尔值和指针格式化
fmt.Sprintf 可以格式化布尔值和指针。此示例展示了如何显示真值和内存地址。
package main
import "fmt"
func main() {
flag := true
num := 42
ptr := &num
boolFmt := fmt.Sprintf("Boolean: %t", flag)
ptrFmt := fmt.Sprintf("Pointer: %p", ptr)
typeFmt := fmt.Sprintf("Type: %T", ptr)
fmt.Println(boolFmt)
fmt.Println(ptrFmt)
fmt.Println(typeFmt)
}
%t 将布尔值格式化为 true/false。%p 以十六进制显示指针地址。%T 显示变量的类型,这对于调试很有用。
结构体和自定义格式化
fmt.Sprintf 可以格式化结构体并实现自定义 Stringer 接口。此示例演示了结构体格式化选项。
package main
import "fmt"
type Person struct {
Name string
Age int
}
func (p Person) String() string {
return fmt.Sprintf("%s (%d years)", p.Name, p.Age)
}
func main() {
p := Person{"Bob", 35}
defaultFmt := fmt.Sprintf("Default: %v", p)
fieldNames := fmt.Sprintf("With fields: %+v", p)
goSyntax := fmt.Sprintf("Go syntax: %#v", p)
customFmt := fmt.Sprintf("Custom: %s", p)
fmt.Println(defaultFmt)
fmt.Println(fieldNames)
fmt.Println(goSyntax)
fmt.Println(customFmt)
}
%v 显示结构体值,%+v 包含字段名,%#v 显示 Go 语法。String() 方法在使用 %s 动词时启用自定义格式化。
带宽度和精度的复杂格式化
fmt.Sprintf 支持带宽度和精度说明符的高级格式化。此示例展示了复杂的格式化组合。
package main
import "fmt"
func main() {
products := []struct {
Name string
Price float64
}{
{"Laptop", 999.99},
{"Phone", 699.50},
{"Tablet", 450.00},
}
var report string
for _, p := range products {
line := fmt.Sprintf("| %-10s | %8.2f |\n", p.Name, p.Price)
report += line
}
header := fmt.Sprintf("| %-10s | %8s |\n", "Product", "Price")
separator := fmt.Sprintf("|%-12s|%-10s|\n", "------------", "----------")
fmt.Print(header + separator + report)
}
%-10s 在 10 个字符的宽度内左对齐字符串。%8.2f 在 8 个字符的宽度内右对齐浮点数,并保留 2 位小数。这可以创建整齐排列的列。
来源
本教程通过各种数据类型和场景的实际字符串格式化示例,介绍了 Go 中的 fmt.Sprintf 函数。