ZetCode

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 等格式动词指定如何格式化值。

basic_format.go
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 为整数格式化提供了各种选项。此示例显示了不同的基数表示和填充选项。

integer_format.go
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 位宽度。这对于一致的格式很有用。

浮点数精度

浮点数可以以特定的精度格式化。此示例演示了如何控制小数位数和科学计数法。

float_format.go
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 处理。

string_format.go
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 可以格式化布尔值和指针。此示例展示了如何显示真值和内存地址。

bool_ptr_format.go
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 接口。此示例演示了结构体格式化选项。

struct_format.go
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 支持带宽度和精度说明符的高级格式化。此示例展示了复杂的格式化组合。

advanced_format.go
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 包文档

本教程通过各种数据类型和场景的实际字符串格式化示例,介绍了 Go 中的 fmt.Sprintf 函数。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Golang 教程