ZetCode

Golang fmt.Fprintln 函数

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

本教程将解释如何在 Go 中使用 fmt.Fprintln 函数。我们将通过实际格式化输出操作的例子来介绍基本用法。

fmt.Fprintln 函数将格式化文本写入 `io.Writer`。它会在操作数之间添加空格并在末尾追加一个换行符。此函数非常适合写入各种输出目标。

在 Go 中,fmt.Fprintln 是 fmt 包中用于格式化 I/O 的一部分。它类似于 fmt.Println,但它写入指定的 writer 而不是标准输出。

Fprintln 的基本用法

fmt.Fprintln 最简单的用法是写入标准输出。此示例演示了带换行符的基本格式化输出。
注意: 该函数会自动在参数之间添加空格。

basic_fprintln.go
package main

import (
    "fmt"
    "os"
)

func main() {
    // Write to standard output
    fmt.Fprintln(os.Stdout, "Hello,", "World!")
    
    // Equivalent to fmt.Println
    fmt.Println("Hello,", "World!")
}

两个调用都会产生相同的输出。fmt.Println 实际上是使用 fmt.Fprintlnos.Stdout 实现的。

写入文件

fmt.Fprintln 可以写入任何 io.Writer,包括文件。此示例说明如何将格式化文本写入文件。

file_write.go
package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Create("output.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    
    fmt.Fprintln(file, "This line goes to the file")
    fmt.Fprintln(file, "Multiple", "values", "joined", "with spaces")
    
    fmt.Println("Data written to output.txt")
}

该示例创建一个文件并向其中写入两行。每次调用 Fprintln 都会自动在末尾添加一个换行符。

写入 bytes.Buffer

fmt.Fprintln 可与内存缓冲区(如 bytes.Buffer)配合使用。此示例演示了使用格式化输出来构建字符串。

buffer_write.go
package main

import (
    "bytes"
    "fmt"
)

func main() {
    var buf bytes.Buffer
    
    fmt.Fprintln(&buf, "Building a string")
    fmt.Fprintln(&buf, "Line", 2)
    fmt.Fprintln(&buf, "Final line")
    
    fmt.Println("Buffer content:")
    fmt.Println(buf.String())
}

bytes.Buffer 会累积输出。这对于高效构建字符串或在写入之前准备输出非常有用。

自定义写入器实现

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

custom_writer.go
package main

import (
    "fmt"
)

type ConsoleWriter struct{}

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

func main() {
    cw := ConsoleWriter{}
    
    fmt.Fprintln(cw, "This goes through our custom writer")
    fmt.Fprintln(cw, "Multiple", "values", "formatted")
}

ConsoleWriter 类型实现了 Writer 接口。fmt.Fprintln 可以像使用任何标准 writer 一样使用它。

写入 HTTP 响应

fmt.Fprintln 通常在 Web 服务器中用于编写 HTTP 响应。此示例展示了 HTTP 响应的写入。

http_response.go
package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Welcome to our website!")
    fmt.Fprintln(w, "Request method:", r.Method)
    fmt.Fprintln(w, "Request path:", r.URL.Path)
}

func main() {
    http.HandleFunc("/", handler)
    fmt.Println("Server starting on port 8080...")
    http.ListenAndServe(":8080", nil)
}

http.ResponseWriter 实现了 io.Writer,因此与 fmt.Fprintln 兼容。每次调用都会向响应添加一个新行。

使用 Fprintln 进行错误处理

fmt.Fprintln 返回写入的字节数以及任何错误。此示例演示了正确的错误处理。

error_handling.go
package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Create("/readonly/test.txt")
    if err != nil {
        fmt.Println("Error creating file:", err)
        return
    }
    defer file.Close()
    
    n, err := fmt.Fprintln(file, "Test data")
    if err != nil {
        fmt.Println("Write error:", err)
        return
    }
    
    fmt.Printf("Successfully wrote %d bytes\n", n)
}

该示例检查了文件创建和写入操作的结果。正确的错误处理对于稳健的文件操作至关重要。

与其他 fmt 函数结合使用

fmt.Fprintln 可以与其他 fmt 函数结合使用以进行复杂的输出格式化。此示例展示了混合使用。

combined_formatting.go
package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Fprint(os.Stdout, "No newline: ")
    fmt.Fprintln(os.Stdout, "This adds a newline")
    
    fmt.Fprintf(os.Stdout, "Formatted: %d %s\n", 42, "answer")
    fmt.Fprintln(os.Stdout, "Final line")
}

该示例混合使用了 FprintFprintlnFprintf。每个函数在写入同一个 writer 的同时,满足不同的格式化需求。

来源

Go fmt 包文档

本教程通过实际示例,介绍了 Go 中 fmt.Fprintln 函数如何将格式化输出写入各种 writer。

作者

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

列出所有 Golang 教程