Go语言的文件操作

Go 语言文件处理核心基础

Go 语言的文件处理主要依赖标准库的 os 包(核心文件操作)、io/ioutil(Go1.16 后被移入 ioos 包)、bufio(带缓冲的读写),下面按 "读、写、改、查" 的逻辑讲解核心操作。

1. 文件的基本读取

读取文件是最基础的操作,Go 提供了多种读取方式,适配不同场景:

方式 1:一次性读取整个文件(小文件首选)

适合文件体积小的场景,一行代码即可读取全部内容:

Go 复制代码
package main

import (
	"fmt"
	"os"
)

func main() {
	// 读取文件全部内容,返回字节切片和错误
	content, err := os.ReadFile("test.txt")
	if err != nil {
		fmt.Printf("读取文件失败:%v\n", err)
		return
	}
	// 将字节切片转为字符串输出
	fmt.Println("文件内容:", string(content))
}
方式 2:带缓冲读取(大文件首选)

适合大文件,逐行 / 逐块读取,避免一次性加载到内存导致 OOM:

Go 复制代码
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	// 打开文件:os.Open默认以只读模式打开,返回文件句柄和错误
	file, err := os.Open("large_file.txt")
	if err != nil {
		fmt.Printf("打开文件失败:%v\n", err)
		return
	}
	// 关键:defer确保函数结束时关闭文件句柄,释放资源
	defer file.Close()

	// 创建带缓冲的读取器
	scanner := bufio.NewScanner(file)
	// 逐行读取
	lineNum := 1
	for scanner.Scan() {
		line := scanner.Text() // 获取当前行的字符串
		fmt.Printf("第%d行:%s\n", lineNum, line)
		lineNum++
	}

	// 检查读取过程中是否有错误
	if err := scanner.Err(); err != nil {
		fmt.Printf("读取文件出错:%v\n", err)
	}
}
2. 文件的写入

写入文件分为 "覆盖写入" 和 "追加写入",核心用 os.Create(覆盖)或 os.OpenFile(自定义模式):

方式 1:覆盖写入文件

os.Create 会创建文件(不存在则新建,存在则清空):

Go 复制代码
package main

import (
	"fmt"
	"os"
)

func main() {
	// 写入的内容
	content := []byte("Hello Go File!\n这是覆盖写入的内容")
	// 写入文件,参数:文件名、内容、权限(0644表示所有者可读可写,其他用户只读)
	err := os.WriteFile("output.txt", content, 0644)
	if err != nil {
		fmt.Printf("写入文件失败:%v\n", err)
		return
	}
	fmt.Println("文件写入成功")
}
方式 2:追加写入文件

需要用 os.OpenFile 指定打开模式为 "追加 + 写入":

Go 复制代码
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	// 打开文件:
	// os.O_APPEND:追加模式
	// os.O_WRONLY:只写模式
	// os.O_CREATE:文件不存在则创建
	file, err := os.OpenFile("output.txt", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
	if err != nil {
		fmt.Printf("打开文件失败:%v\n", err)
		return
	}
	defer file.Close()

	// 创建带缓冲的写入器,提升写入效率
	writer := bufio.NewWriter(file)
	// 写入内容
	_, err = writer.WriteString("\n这是追加的内容")
	if err != nil {
		fmt.Printf("写入内容失败:%v\n", err)
		return
	}
	// 关键:缓冲写入需要刷新,否则内容可能留在缓冲区未写入文件
	writer.Flush()
	fmt.Println("内容追加成功")
}
3. 文件的常用操作(改、查、删)

除了读写,日常还会用到文件重命名、删除、查看信息等操作:

Go 复制代码
package main

import (
	"fmt"
	"os"
	"time"
)

func main() {
	//2、文件操作
	// 2.1 重命名文件
	err := os.Rename("F:\\CompanyFiles\\go_output_file.txt", "F:\\CompanyFiles\\go_output_file2.txt")
	if err != nil {
		fmt.Printf("Error renaming file: %v\n", err)
	}

	//2.2 获取文件信息(文件大小、修改时间、是否是目录等)
	fileInfo, err := os.Stat("F:\\CompanyFiles\\go_output_file2.txt")
	if err != nil {
		fmt.Printf("Error getting file info: %v\n", err)
		return
	}
	fmt.Printf("文件名:%v\n", fileInfo.Name())
	fmt.Printf("文件大小%v\n", fileInfo.Size())
	fmt.Printf("文件修改时间%v\n", fileInfo.ModTime().Format(time.DateTime))
	fmt.Printf("是否是目录:%t\n", fileInfo.IsDir())

	//2.3 删除文件
	err = os.Remove("F:\\CompanyFiles\\go_output_file2.txt")
	if err != nil {
		fmt.Printf("Error removing file: %v\n", err)
	}
}
4. 目录操作

文件处理常伴随目录操作(创建目录、遍历目录):

Go 复制代码
package main

import (
	"fmt"
	"os"
)

func main() {
	// 1. 创建目录(0755表示所有者可读可写可执行,其他用户只读可执行)
	err := os.Mkdir("test_dir", 0755)
	if err != nil {
		fmt.Printf("创建目录失败:%v\n", err)
	}
	// 创建多级目录用 MkdirAll
	os.MkdirAll("parent/child/grandchild", 0755)

	// 2. 遍历目录
	dirEntries, err := os.ReadDir("test_dir")
	if err != nil {
		fmt.Printf("遍历目录失败:%v\n", err)
		return
	}
	for _, entry := range dirEntries {
		fmt.Printf("名称:%s,是否是目录:%t\n", entry.Name(), entry.IsDir())
	}
}

总结

Go 语言文件处理的核心要点:

  1. 核心包os 包是基础(打开、读写、删除、重命名),bufio 适合大文件缓冲读写,替代了旧的 ioutil
  2. 资源释放 :打开文件后必须用 defer file.Close() 释放句柄,避免资源泄漏;
  3. 写入注意 :缓冲写入(bufio.Writer)需要调用 Flush() 确保内容落地,追加写入需指定 os.O_APPEND 模式。
相关推荐
我命由我123451 小时前
Android 开发问题:Duplicate class android.support.v4.app.INotificationSideChannel...
android·java·开发语言·java-ee·android studio·android-studio·android runtime
小白学大数据2 小时前
Python 进阶爬虫:解析知识星球 API
开发语言·爬虫·python
赴前尘2 小时前
记一次golang进程执行卡住的问题排查
开发语言·后端·golang
whale fall2 小时前
如何在同一台电脑里安装32 位 Python 和 64 位 Python
开发语言·笔记·python·学习
.清和.2 小时前
【js】Javascript事件循环机制
开发语言·javascript·ecmascript
码农小卡拉2 小时前
Prometheus 监控 SpringBoot 应用完整教程
spring boot·后端·grafana·prometheus
瑞雪兆丰年兮2 小时前
[从0开始学Java|第十一天]ArrayList
java·开发语言
黄筱筱筱筱筱筱筱2 小时前
第三次Python练习题
开发语言·python
夜郎king2 小时前
基于 Java 实现数九天精准计算:从节气算法到工程化落地
java·开发语言