
本文介绍在 Go 语言中将 fmt 系列函数的输出(如 fmt.Printf)重定向到文件的方法,核心是使用 fmt.Fprintf 配合 os.File 和 bufio.Writer 实现高效、可控的文件写入。
本文介绍在 go 语言中将 `fmt` 系列函数的输出(如 `fmt.printf`)重定向到文件的方法,核心是使用 `fmt.fprintf` 配合 `os.file` 和 `bufio.writer` 实现高效、可控的文件写入。
在 Go 中,fmt.Printf 默认输出到标准输出(os.Stdout),但标准库提供了更灵活的替代方案:fmt.Fprintf。它接受任意实现了 io.Writer 接口的对象(如打开的文件句柄)作为第一个参数,从而将格式化内容写入目标位置,而非控制台。
以下是一个完整、可运行的示例,将随机排列结果(如 [5 1 2 4 0 3])及其元素逐行写入文本文件:
package main
import (
"bufio"
"fmt"
"os"
"math/rand"
"time"
)
func main() {
// 创建输出文件(若存在则清空重写)
f, err := os.Create("output.txt")
if err != nil {
panic(fmt.Sprintf("无法创建文件: %v", err))
}
defer f.Close()
// 使用 bufio.Writer 提升小量写入性能(自动缓冲)
writer := bufio.NewWriter(f)
defer writer.Flush() // 确保所有缓冲内容写入磁盘
// 生成随机排列
r := rand.New(rand.NewSource(time.Now().UnixNano()))
perm := r.Perm(6) // 注意:r.Perm(n) 返回 [0, n) 的随机排列,长度为 n
// 使用 fmt.Fprintf 将格式化内容写入文件
fmt.Fprintf(writer, "%v\n", perm) // 例如:[2 5 0 4 1 3]
fmt.Fprintf(writer, "%d\n", perm[0]) // 第一个元素
fmt.Fprintf(writer, "%d\n", perm[1]) // 第二个元素
}
✅ 关键要点说明:
- os.Create("output.txt") 创建/覆盖指定路径的文件;若需追加,请改用 os.OpenFile(..., os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)。
- bufio.NewWriter 并非必需,但对频繁小写入能显著提升性能;务必调用 writer.Flush()(或通过 defer 保证),否则缓冲区内容可能未落盘。
- fmt.Fprintf 返回 (int, error),实际项目中应显式检查错误(如 if err != nil { /* 处理 */ }),避免仅依赖 panic——这在服务端程序中可能导致进程崩溃。
? 进阶建议:
- 若只需一次性写入字符串,可直接用 os.WriteFile("output.txt", []byte(content), 0644),更简洁;
- 对结构化数据(如 JSON),推荐 json.NewEncoder(file).Encode(v),语义清晰且安全;
- 涉及并发写入时,需额外加锁或使用线程安全的 writer。
掌握 fmt.Fprintf + io.Writer 组合,即可自由将任何格式化输出导向文件、网络连接甚至内存缓冲区,这是 Go I/O 设计统一性与扩展性的典型体现。











