Go语言的文件处理操作

文件处理是编程中最常用的功能之一,无论是读取配置、写入日志、处理文本,还是数据存储,都离不开文件操作。Go 语言提供了非常简洁、强大的标准库来完成文件的创建、读写、复制、删除、判断等操作,最核心的包是 osio/ioutil (Go 1.16 后推荐使用 osio)。

本文从最基础到最常用,一步步讲解,代码可直接复制运行,适合作业、考试、实战使用。


一、文件操作必备包

Go 语言文件操作主要使用 3 个包:

  1. os:文件打开、创建、删除、权限、状态判断
  2. bufio:带缓冲的读写(高效读写大文件)
  3. io:基础读写接口
  4. 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)

七、文件操作易错点总结

  1. 打开文件必须判断错误,否则文件不存在会崩溃
  2. 必须 defer file.Close () 关闭文件
  3. 缓冲写入必须调用 Flush()
  4. 追加写入必须使用 os.O_APPEND 模式
  5. 小文件用 ReadFile/WriteFile,大文件用 bufio
  6. 跨平台路径使用 filepath.Join()

八、完整示例:读写小文件

复制代码
package main

import "os"

func main() {
    // 写入
    os.WriteFile("test.txt", []byte("Go语言文件操作"), 0666)

    // 读取
    content, _ := os.ReadFile("test.txt")
    println(string(content))
}
相关推荐
jieyucx2 小时前
Golang 完整安装与 VSCode 开发环境搭建教程
开发语言·vscode·golang
codeejun4 小时前
每日一Go-52、Go微服务--请求超时与熔断策略实战
微服务·golang·iphone
codeejun7 小时前
每日一Go-53、Go微服务--限流与降级
开发语言·微服务·golang
NotFound4867 小时前
Go语言中的图形界面开发实战解析:从GUI到WebAssembly
开发语言·golang·wasm
2401_832635587 小时前
小白分享如何Go 语言中的图形界面开发:从 GUI 到 WebAssembly
microsoft·golang·wasm
XMYX-09 小时前
15 - Go 泛型(Generics):从入门到实战
开发语言·golang
geovindu9 小时前
密码进行加盐哈希 using CSharp,Python,Go,Java
java·python·golang·c#·哈希算法
参.商.1 天前
【Day51】78.子集
golang·排序算法
王码码20351 天前
Go语言中的配置管理:从Viper到环境变量
后端·golang·go·接口