在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文件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)}四、关键注意事项- 错误处理:所有文件操作均需检查错误,避免程序异常退出。
- 资源释放:使用defer file.Close()确保文件句柄释放,防止资源泄漏。
- 文件权限:写入文件时需指定权限模式(如0644),确保安全性。
- 性能优化:
大文件优先使用bufio流式处理。
小文件直接使用ReadFile/WriteFile简化代码。
五、总结- 小文件读写:ReadFile/WriteFile最简洁。
- 大文件处理:os.Open + bufio逐行读取。
- 追加写入:OpenFile配合O_APPEND标志。
- 结构化数据:结合encoding/json或encoding/csv解析。
通过合理选择方法并严格处理错误,可高效完成Golang文件操作。