ZetCode

Golang fmt.Printf 函数

最后修改时间 2025 年 5 月 8 日

本教程解释了如何在 Go 中使用 fmt.Printf 函数。我们将通过格式化输出的实际示例来涵盖格式化基础知识。

fmt.Printf 函数根据格式说明符进行格式化,并写入标准输出。它返回写入的字节数和任何错误。这是 Go 中格式化输出的主要函数。

在 Go 中,fmt.Printf 使用以 % 开头的格式动词来指定值的显示方式。这些动词控制输出中的填充、精度和数据类型表示。

基本的 Printf 示例

fmt.Printf 最简单的用法以默认格式显示变量。此示例演示了基本的字符串和数字格式化。
注意:格式字符串必须与参数数量匹配。

basic_printf.go
package main

import "fmt"

func main() {
    name := "Alice"
    age := 28
    height := 1.68
    
    fmt.Printf("Name: %s, Age: %d, Height: %.2f\n", name, age, height)
}

格式字符串包含三个动词:%s 用于字符串,%d 用于整数,%.2f 用于具有 2 位小数的浮点数。值按顺序插入。

整数格式化

整数格式化为基表示和填充提供了各种选项。此示例展示了不同的整数格式化技术。

integer_formatting.go
package main

import "fmt"

func main() {
    num := 42
    
    fmt.Printf("Decimal: %d\n", num)
    fmt.Printf("Binary: %b\n", num)
    fmt.Printf("Hexadecimal: %x\n", num)
    fmt.Printf("Octal: %o\n", num)
    fmt.Printf("With sign: %+d\n", num)
    fmt.Printf("Padded: %6d\n", num)
    fmt.Printf("Leading zeros: %06d\n", num)
}

每个动词以不同的方式显示数字。%b 显示二进制,%x 显示十六进制,%o 显示八进制。填充会添加空格或零以达到指定的宽度。

浮点数格式化

浮点数可以用精度、科学计数法和自动格式化进行格式化。此示例演示了浮点数格式化选项。

float_formatting.go
package main

import "fmt"

func main() {
    pi := 3.1415926535
    
    fmt.Printf("Default: %f\n", pi)
    fmt.Printf("Precision 2: %.2f\n", pi)
    fmt.Printf("Precision 4: %.4f\n", pi)
    fmt.Printf("Scientific: %e\n", pi)
    fmt.Printf("Large exponent: %g\n", 123456789.123456789)
    fmt.Printf("Width 10, precision 3: %10.3f\n", pi)
}

精度控制小数位数。%e 使用科学计数法,而 %g 根据指数大小自动选择 %f 和 %e。

字符串格式化

字符串格式化包括填充、截断和引用选项。此示例展示了各种字符串格式化技术。

string_formatting.go
package main

import "fmt"

func main() {
    str := "Hello, 世界"
    
    fmt.Printf("Default: %s\n", str)
    fmt.Printf("Quoted: %q\n", str)
    fmt.Printf("Hex: % x\n", str)
    fmt.Printf("Right-padded: %-20s!\n", str)
    fmt.Printf("Left-padded: %20s!\n", str)
    fmt.Printf("Truncated: %.5s\n", str)
}

%q 添加引号,%x 显示十六进制字节,%.5s 在 5 个字节后截断(不是 rune)。填充会在指定宽度内向左或向右对齐文本。

布尔值和指针格式化

布尔值和指针有特定的格式动词。此示例演示了如何显示这些类型。

bool_pointer_formatting.go
package main

import "fmt"

func main() {
    flag := true
    ptr := &flag
    
    fmt.Printf("Boolean: %t\n", flag)
    fmt.Printf("Pointer: %p\n", ptr)
    fmt.Printf("Pointer value: %v\n", ptr)
    fmt.Printf("Type and value: %T %v\n", ptr, ptr)
}

%t 将布尔值格式化为“true”或“false”。%p 以十六进制显示指针地址。%T 显示值的类型,这对于调试很有用。

结构体格式化

可以使用不同的动词格式化结构体,以控制输出的详细程度。此示例展示了结构体格式化选项。

struct_formatting.go
package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{"Bob", 42}
    
    fmt.Printf("Default: %v\n", p)
    fmt.Printf("With field names: %+v\n", p)
    fmt.Printf("Go syntax: %#v\n", p)
    fmt.Printf("Type: %T\n", p)
}

%v 显示值,%+v 包含字段名称,%#v 显示可以重新创建该值的 Go 语法。这些对于调试复杂类型很有用。

使用 Stringer 进行自定义格式化

类型可以实现 Stringer 接口来定制它们的格式。此示例演示了用户定义类型的自定义格式化。

stringer_formatting.go
package main

import "fmt"

type Point struct {
    X, Y int
}

func (p Point) String() string {
    return fmt.Sprintf("(%d,%d)", p.X, p.Y)
}

func main() {
    p := Point{3, 4}
    
    fmt.Printf("Point: %v\n", p)
    fmt.Printf("String: %s\n", p)
    fmt.Printf("Go syntax: %#v\n", p)
}

通过实现 String(),Point 控制其在格式化输出中的显示方式。这由 %v 和 %s 格式动词自动调用。

来源

Go fmt 包文档

本教程通过格式化输出的实际示例和各种格式化技术,涵盖了 Go 中的 fmt.Printf 函数。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Golang 教程