如何使用Golang进行文件读写操作

如何使用Golang进行文件读写操作
最新回答
少女心泛滥

2026-01-23 12:43:50

在Golang中进行文件读写操作可通过标准库os、bufio及encoding/json等实现,具体方法根据文件大小和场景选择,核心步骤包括打开文件、读写操作、错误处理和资源释放。以下是详细说明和示例:

一、读取文件1. 大文件逐行读取(推荐os.Open + bufio.Scanner)
  • 适用场景:大文件或需逐行处理的场景(如日志分析)。
  • 原理:通过os.Open打开文件,用bufio.Scanner逐行读取,避免内存溢出。
  • 示例代码:
package mainimport ( "bufio" "fmt" "log" "os")func readFileLineByLine(filename string) { file, err := os.Open(filename) if err != nil { log.Fatal(err) } defer file.Close() // 确保文件关闭 scanner := bufio.NewScanner(file) for scanner.Scan() { fmt.Println(scanner.Text()) // 逐行输出内容 } if err := scanner.Err(); err != nil { log.Fatal(err) // 检查扫描错误 }}2. 小文件一次性读取(推荐os.ReadFile)
  • 适用场景:小文件(如配置文件、JSON数据)。
  • 原理:直接读取整个文件到内存,简洁高效。
  • 示例代码:
content, err := os.ReadFile("example.txt")if err != nil { log.Fatal(err)}fmt.Println(string(content)) // 输出文件内容二、写入文件1. 覆盖写入(推荐os.WriteFile)
  • 适用场景:创建新文件或覆盖已有文件。
  • 原理:直接写入字节切片,自动处理文件创建和权限设置。
  • 示例代码:
err := os.WriteFile("output.txt", []byte("Hello, Golang!"), 0644)if err != nil { log.Fatal(err)}2. 追加写入(推荐os.OpenFile)
  • 适用场景:向已有文件追加内容(如日志记录)。
  • 原理:通过os.O_APPEND标志打开文件,避免覆盖原有内容。
  • 示例代码:
file, err := os.OpenFile("log.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)if err != nil { log.Fatal(err)}defer file.Close() // 确保文件关闭_, err = file.WriteString("New log entryn")if err != nil { log.Fatal(err)}三、处理结构化数据(如JSON)1. 读取JSON文件
  • 步骤:

    用os.ReadFile读取文件内容。

    通过json.Unmarshal解析为结构体。

  • 示例代码:
type User struct { Name string `json:"name"` Age int `json:"age"`}file, err := os.ReadFile("user.json")if err != nil { log.Fatal(err)}var user Usererr = json.Unmarshal(file, &user)if err != nil { log.Fatal(err)}fmt.Printf("%+vn", user) // 输出结构化数据2. 写入JSON文件
  • 步骤:

    将结构体通过json.Marshal编码为字节切片。

    用os.WriteFile写入文件。

  • 示例代码:
user := User{Name: "Alice", Age: 25}data, err := json.Marshal(user)if err != nil { log.Fatal(err)}err = os.WriteFile("output.json", data, 0644)if err != nil { log.Fatal(err)}四、关键注意事项
  1. 错误处理:所有文件操作均需检查错误,避免程序异常退出。
  2. 资源释放:使用defer file.Close()确保文件句柄释放,防止资源泄漏。
  3. 文件权限:写入文件时需指定权限模式(如0644),确保安全性。
  4. 性能优化:

    大文件优先使用bufio流式处理。

    小文件直接使用ReadFile/WriteFile简化代码。

五、总结
  • 小文件读写:ReadFile/WriteFile最简洁。
  • 大文件处理:os.Open + bufio逐行读取。
  • 追加写入:OpenFile配合O_APPEND标志。
  • 结构化数据:结合encoding/json或encoding/csv解析。

通过合理选择方法并严格处理错误,可高效完成Golang文件操作。