ZetCode

Golang fmt.Fprint 函数

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

本教程将讲解如何在 Go 中使用 `fmt.Fprint` 函数。我们将通过实际示例,介绍将其用于向各种 io.Writer 写入的基本用法。

fmt.Fprint 函数将格式化的文本写入 io.Writer 接口。它是 Go 的 fmt 包的一部分,非常适合向文件、缓冲区或网络连接进行格式化写入。

与写入标准输出的 fmt.Print 不同,fmt.Fprint 可以写入 io.Writer 的任何实现。这使得它在处理不同的输出目标时更加灵活。

Fprint 的基本用法

fmt.Fprint 最简单的用法是写入标准输出。此示例演示了基本字符串写入。
注意: os.Stdout 实现了 io.Writer 接口。

basic_fprint.go
package main

import (
    "fmt"
    "os"
)

func main() {
    n, err := fmt.Fprint(os.Stdout, "Hello, World!\n")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Printf("\nWrote %d bytes\n", n)
}

该函数将 "Hello, World!" 写入标准输出。它会返回写入的字节数以及写入过程中发生的任何错误。

使用 Fprint 向文件写入

由于 os.File 实现了 io.Writer,因此 `fmt.Fprint` 可以写入文件。此示例展示了带错误处理的文件写入。

file_fprint.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()

    n, err := fmt.Fprint(file, "Writing to a file with Fprint\n")
    if err != nil {
        fmt.Println("Error writing to file:", err)
        return
    }
    fmt.Printf("Wrote %d bytes to file\n", n)
}

该代码创建一个文件并将一个字符串写入其中。在处理文件时,请务必检查错误,并使用 defer 正确关闭它们。

使用 Fprint 写入多个值

fmt.Fprint 可以写入多个由空格分隔的值。此示例演示了写入不同数据类型。

multiple_values.go
package main

import (
    "fmt"
    "os"
)

func main() {
    name := "Alice"
    age := 30
    height := 5.8
    
    n, err := fmt.Fprint(os.Stdout, name, " is ", age, 
        " years old and ", height, " feet tall\n")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Printf("Wrote %d bytes\n", n)
}

该函数会自动将值转换为字符串,并用空格分隔它们。除非显式包含,否则不会添加换行符。

将 Fprint 与 bytes.Buffer 一起使用

fmt.Fprint 可与 bytes.Buffer 一起用于内存中的字符串构建。此示例展示了高效的字符串连接。

buffer_fprint.go
package main

import (
    "bytes"
    "fmt"
)

func main() {
    var buf bytes.Buffer
    
    fmt.Fprint(&buf, "First part, ")
    fmt.Fprint(&buf, "second part, ")
    fmt.Fprint(&buf, "third part\n")
    
    fmt.Println("Buffer content:")
    fmt.Print(buf.String())
    
    fmt.Printf("Buffer length: %d bytes\n", buf.Len())
}

bytes.Buffer 在从多个部分构建字符串时非常高效。它避免了字符串连接的多次内存分配。

自定义写入器实现

任何实现了 io.Writer 的类型都可以与 `fmt.Fprint` 一起使用。此示例展示了一个自定义写入器实现。

custom_writer.go
package main

import (
    "fmt"
)

type ConsoleWriter struct{}

func (cw ConsoleWriter) Write(p []byte) (n int, err error) {
    fmt.Print("Custom writer: ")
    return fmt.Print(string(p))
}

func main() {
    cw := ConsoleWriter{}
    
    n, err := fmt.Fprint(cw, "Hello from custom writer!\n")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Printf("Wrote %d bytes via custom writer\n", n)
}

ConsoleWriter 类型实现了 Write 方法,使其与 fmt.Fprint 兼容。这展示了 Go 接口系统的灵活性。

写入网络连接

由于网络连接实现了 io.Writer,因此 `fmt.Fprint` 可以写入网络连接。此示例展示了基本网络写入。

network_fprint.go
package main

import (
    "fmt"
    "net"
    "time"
)

func main() {
    conn, err := net.Dial("tcp", "example.com:80")
    if err != nil {
        fmt.Println("Error connecting:", err)
        return
    }
    defer conn.Close()

    // Set deadline for write operation
    conn.SetWriteDeadline(time.Now().Add(5 * time.Second))
    
    n, err := fmt.Fprint(conn, "GET / HTTP/1.0\r\n\r\n")
    if err != nil {
        fmt.Println("Error writing:", err)
        return
    }
    fmt.Printf("Sent %d bytes to server\n", n)
}

该示例向 Web 服务器发送 HTTP 请求。在处理网络连接时,请务必处理错误并设置超时。

将 Fprint 与其他写入器结合使用

fmt.Fprint 可与 io.MultiWriter 一起使用,同时写入多个目标。此示例演示了此技术。

multi_writer.go
package main

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

func main() {
    var buf bytes.Buffer
    multi := io.MultiWriter(os.Stdout, &buf)
    
    n, err := fmt.Fprint(multi, "Writing to multiple destinations\n")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    
    fmt.Printf("Wrote %d bytes total\n", n)
    fmt.Println("Buffer content:", buf.String())
}

输出将同时写入标准输出和缓冲区。这对于日志记录或需要在显示输出的同时捕获输出的情况非常有用。

来源

Go fmt 包文档

本教程通过实际示例,介绍了 Go 中 `fmt.Fprint` 函数以及向各种 io.Writer 实现写入的内容。

作者

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

列出所有 Golang 教程