Go语言的文件处理操作
2026/4/21 3:26:14 网站建设 项目流程

文件处理是编程中最常用的功能之一,无论是读取配置、写入日志、处理文本,还是数据存储,都离不开文件操作。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)) }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询