Go语言的文件处理操作
文件处理是编程中最常用的功能之一,无论是读取配置、写入日志、处理文本,还是数据存储,都离不开文件操作。Go 语言提供了非常简洁、强大的标准库来完成文件的创建、读写、复制、删除、判断等操作,最核心的包是os和io/ioutil(Go 1.16 后推荐使用os和io)。
本文从最基础到最常用,一步步讲解,代码可直接复制运行,适合作业、考试、实战使用。
一、文件操作必备包
Go 语言文件操作主要使用 3 个包:
- os:文件打开、创建、删除、权限、状态判断
- bufio:带缓冲的读写(高效读写大文件)
- io:基础读写接口
- path/filepath:路径处理(跨平台)
二、文件打开与关闭
1. 打开文件(os.Open)
file, err := os.Open("test.txt")作用:以只读方式打开文件。
2. 创建文件(os.Create)
file, err := os.Create("test.txt")作用:创建新文件,若文件已存在则清空内容。
3. 打开文件并指定模式(os.OpenFile)
最强大的打开方式,可指定:
- 只读
- 只写
- 追加
- 读写
file, err := os.OpenFile("test.txt", os.O_APPEND|os.O_WRONLY, 0666)常用模式:
os.O_RDONLY:只读os.O_WRONLY:只写os.O_RDWR:读写os.O_CREATE:不存在则创建os.O_APPEND:追加写os.O_TRUNC:清空文件
4. 关闭文件(defer file.Close ())
文件打开后必须关闭,否则会造成资源泄漏。固定写法:
file, err := os.Open("test.txt") if err != nil { fmt.Println("打开失败:", err) return } defer file.Close() // 自动关闭三、文件读取操作(4 种常用方法)
1. 一次性读取全部内容(最简单)
content, err := os.ReadFile("test.txt") if err != nil { log.Fatal(err) } fmt.Println(string(content))优点:代码少,适合小文件。
2. 按字节读取
buf := make([]byte, 1024) n, _ := file.Read(buf) fmt.Println("读取字节数:", n) fmt.Println("内容:", string(buf[:n]))3. 按行读取(最常用,适合大文件)
使用bufio.Scanner按行读取:
file, _ := os.Open("test.txt") defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { line := scanner.Text() fmt.Println(line) }4. 带缓冲读取(高效读取大文件)
reader := bufio.NewReader(file) buf := make([]byte, 1024) reader.Read(buf)四、文件写入操作
1. 一次性写入(最简单)
content := "Hello Go 文件操作" err := os.WriteFile("test.txt", []byte(content), 0666)特点:覆盖原有内容。
2. 追加写入
必须使用OpenFile并指定追加模式:
file, err := os.OpenFile("test.txt", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0666) defer file.Close() file.WriteString("我是追加的内容\n")3. 缓冲写入(高效写入)
writer := bufio.NewWriter(file) writer.WriteString("使用缓冲写入\n") writer.Flush() // 必须刷新才会真正写入文件五、文件常用操作
1. 判断文件是否存在
_, err := os.Stat("test.txt") if os.IsNotExist(err) { fmt.Println("文件不存在") } else { fmt.Println("文件存在") }2. 删除文件
err := os.Remove("test.txt")3. 获取文件信息
info, _ := os.Stat("test.txt") fmt.Println("文件名:", info.Name()) fmt.Println("文件大小:", info.Size()) fmt.Println("是否是目录:", info.IsDir()) fmt.Println("修改时间:", info.ModTime())4. 创建目录
os.Mkdir("test", 0777) // 创建单个目录 os.MkdirAll("a/b/c", 0777) // 递归创建多级目录5. 遍历目录
files, _ := os.ReadDir(".") for _, file := range files { fmt.Println(file.Name()) }六、文件复制
src, _ := os.Open("src.txt") dst, _ := os.Create("dst.txt") defer src.Close() defer dst.Close() io.Copy(dst, src)七、文件操作易错点总结
- 打开文件必须判断错误,否则文件不存在会崩溃
- 必须 defer file.Close ()关闭文件
- 缓冲写入必须调用Flush()
- 追加写入必须使用os.O_APPEND模式
- 小文件用
ReadFile/WriteFile,大文件用bufio - 跨平台路径使用
filepath.Join()
八、完整示例:读写小文件
package main import "os" func main() { // 写入 os.WriteFile("test.txt", []byte("Go语言文件操作"), 0666) // 读取 content, _ := os.ReadFile("test.txt") println(string(content)) }