
本文介绍使用 fmt.fprintf 结合文件句柄将 go 程序的格式化输出(如切片、数值等)直接写入文本文件的方法,并提供完整可运行示例,涵盖文件创建、缓冲写入、错误处理与刷新机制。
本文介绍使用 fmt.fprintf 结合文件句柄将 go 程序的格式化输出(如切片、数值等)直接写入文本文件的方法,并提供完整可运行示例,涵盖文件创建、缓冲写入、错误处理与刷新机制。
在 Go 中,fmt.Printf 默认输出到标准输出(os.Stdout),但若需将格式化内容写入文件,应使用 fmt.Fprintf —— 它接受任意实现了 io.Writer 接口的对象(例如 *os.File 或带缓冲的 *bufio.Writer)作为第一个参数,从而实现“定向打印”。
以下是一个生产就绪的示例,它生成随机排列、逐行写入文件,并正确处理资源与错误:
package main
import (
"bufio"
"fmt"
"os"
"math/rand"
"time"
)
func main() {
// 创建输出文件(若存在则清空)
f, err := os.Create("output.txt")
if err != nil {
fmt.Fprintf(os.Stderr, "无法创建文件: %v\n", err)
return
}
defer f.Close()
// 使用 bufio.Writer 提升小量写入性能(减少系统调用)
w := bufio.NewWriter(f)
defer w.Flush() // 确保所有缓冲数据写入文件
// 生成 [0,1,2,3,4] 的随机排列
r := rand.New(rand.NewSource(time.Now().UnixNano()))
i := r.Perm(5)
// 写入格式化内容(等效于原代码的三行 fmt.Printf)
if _, err := fmt.Fprintf(w, "%v\n", i); err != nil {
fmt.Fprintf(os.Stderr, "写入切片失败: %v\n", err)
return
}
if _, err := fmt.Fprintf(w, "%d\n", i[0]); err != nil {
fmt.Fprintf(os.Stderr, "写入首元素失败: %v\n", err)
return
}
if _, err := fmt.Fprintf(w, "%d\n", i[1]); err != nil {
fmt.Fprintf(os.Stderr, "写入次元素失败: %v\n", err)
return
}
}
✅ 关键要点说明:
- os.Create 创建/覆盖文件;若需追加,请改用 os.OpenFile(..., os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)。
- bufio.NewWriter 显著提升频繁小写入的效率,但必须显式调用 Flush()(此处用 defer 保证执行)。
- 错误检查不可省略:每个 fmt.Fprintf 返回 (n int, err error),忽略错误可能导致数据静默丢失。
- 不推荐 panic 处理 I/O 错误(如原答案所提),真实项目中应记录日志、返回错误或优雅降级。
运行后,output.txt 将包含类似内容:
[3 0 4 1 2] 3 0
此方法灵活通用——你可将 w 替换为网络连接、内存缓冲区(bytes.Buffer)或任何 io.Writer,真正实现“一次编写,多端输出”。











