ZetCode

Golang fmt.Fprintf 函数

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

本教程将解释如何在 Go 中使用 fmt.Fprintf 函数。我们将通过将格式化输出写入各种 io.Writer 实现的实际示例,涵盖格式化输出基础知识。

fmt.Fprintf 函数根据格式说明符进行格式化,并写入 io.Writer。它类似于 fmt.Printf,但写入指定的 writer 而不是标准输出。

在 Go 中,fmt.Fprintf 用于将格式化输出写入文件、缓冲区、网络连接或任何实现 io.Writer 接口的类型。它返回写入的字节数以及遇到的任何写入错误。

基本的 Fprintf 示例

fmt.Fprintf 最简单的用法是将格式化文本写入标准输出。此示例演示了基本的格式化打印。
注意: os.Stdout 实现 io.Writer,使其兼容。

basic_fprintf.go
package main

import (
    "fmt"
    "os"
)

func main() {
    name := "Alice"
    age := 28
    
    n, err := fmt.Fprintf(os.Stdout, "%s is %d years old\n", name, age)
    if err != nil {
        fmt.Println("Error:", err)
    }
    fmt.Printf("Wrote %d bytes\n", n)
}

该示例将格式化输出写入标准输出。它显示写入的字节数并处理写入操作可能产生的错误。

使用 Fprintf 写入文件

fmt.Fprintf 可以将格式化文本写入文件。此示例展示了如何创建文件并向其中写入格式化数据。

file_fprintf.go
package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Create("output.txt")
    if err != nil {
        fmt.Println("Error creating file:", err)
        return
    }
    defer file.Close()
    
    items := []string{"apple", "banana", "cherry"}
    for i, item := range items {
        fmt.Fprintf(file, "Item %d: %s\n", i+1, item)
    }
    
    fmt.Println("Data written to file successfully")
}

该示例创建了一个文件,并向其中写入格式化的行。每行包含切片中的项目编号和名称。完成后文件会被正确关闭。

写入 bytes.Buffer

fmt.Fprintf 可以写入内存缓冲区。此示例使用 bytes.Buffer 在使用格式化输出之前收集它。

buffer_fprintf.go
package main

import (
    "bytes"
    "fmt"
)

func main() {
    var buf bytes.Buffer
    
    fmt.Fprintf(&buf, "Current temperature: %.1f°C\n", 23.5)
    fmt.Fprintf(&buf, "Humidity: %d%%\n", 65)
    
    fmt.Println("Buffer content:")
    fmt.Println(buf.String())
}

该示例将格式化字符串写入 bytes.Buffer。缓冲区会收集输出,然后可以将其用作字符串或写入其他地方。

自定义写入器实现

任何实现 io.Writer 的类型都可以与 fmt.Fprintf 一起使用。此示例展示了一个自定义 writer,用于计算写入的字节数。

custom_writer.go
package main

import (
    "fmt"
)

type ByteCounter struct {
    count int
}

func (bc *ByteCounter) Write(p []byte) (n int, err error) {
    bc.count += len(p)
    return len(p), nil
}

func main() {
    var counter ByteCounter
    
    fmt.Fprintf(&counter, "Hello, %s!\n", "world")
    fmt.Fprintf(&counter, "The answer is %d\n", 42)
    
    fmt.Printf("Total bytes written: %d\n", counter.count)
}

ByteCounter 类型通过计算字节来实现 io.Writer。Fprintf 写入我们的自定义 writer,使我们能够跟踪写入的总字节数。

格式化不同的数据类型

fmt.Fprintf 支持各种数据类型的格式说明符。此示例演示了将不同数据类型格式化到 writer。

formatting_types.go
package main

import (
    "fmt"
    "os"
    "time"
)

func main() {
    now := time.Now()
    pi := 3.1415926535
    
    fmt.Fprintf(os.Stdout, "Boolean: %t\n", true)
    fmt.Fprintf(os.Stdout, "Integer: %d\n", 42)
    fmt.Fprintf(os.Stdout, "Float: %.2f\n", pi)
    fmt.Fprintf(os.Stdout, "String: %s\n", "hello")
    fmt.Fprintf(os.Stdout, "Time: %s\n", now.Format(time.RFC3339))
    fmt.Fprintf(os.Stdout, "Pointer: %p\n", &pi)
}

该示例展示了常用的格式说明符:%t 用于布尔值,%d 用于整数,%f 用于浮点数,%s 用于字符串,%p 用于指针。每个都写入标准输出。

使用 Fprintf 进行错误处理

使用 fmt.Fprintf 写入时,正确的错误处理很重要。此示例演示了如何检查写入错误。

error_handling.go
package main

import (
    "fmt"
    "os"
)

func main() {
    // Simulate a write error by using a closed file
    file, err := os.Create("test.txt")
    if err != nil {
        fmt.Println("Error creating file:", err)
        return
    }
    file.Close()
    
    n, err := fmt.Fprintf(file, "This should fail")
    if err != nil {
        fmt.Println("Write error:", err)
        fmt.Println("Bytes written before error:", n)
        return
    }
    
    fmt.Println("Write successful")
}

该示例故意写入一个已关闭的文件以演示错误处理。始终检查 Fprintf 返回的错误值以检测写入失败。

写入多个 writer

fmt.Fprintf 可以使用 io.MultiWriter 同时写入多个 writer。此示例同时写入文件和标准输出。

multi_writer.go
package main

import (
    "fmt"
    "io"
    "os"
)

func main() {
    file, err := os.Create("multi_output.txt")
    if err != nil {
        fmt.Println("Error creating file:", err)
        return
    }
    defer file.Close()
    
    multiWriter := io.MultiWriter(os.Stdout, file)
    
    fmt.Fprintf(multiWriter, "Writing to multiple destinations\n")
    fmt.Fprintf(multiWriter, "This appears in both places\n")
    
    fmt.Println("Check multi_output.txt for the file content")
}

该示例使用 io.MultiWriter 在一次 Fprintf 调用中同时写入控制台和文件。这种模式对于日志记录或类似 tee 的输出很有用。

来源

Go fmt 包文档

本教程通过将格式化输出写入各种 io.Writer 实现的实际示例,涵盖了 Go 中的 fmt.Fprintf 函数。

作者

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

列出所有 Golang 教程