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
函数。