Go语言中的文件与IO:文件读写

在实际开发中,文件操作是常见需求之一。Go 标准库提供了强大的 os、io、bufio 和 ioutil(已废弃,推荐使用 os/io) 等包,支持高效的文件读写。


一、打开与关闭文件

Go 使用 os.Open 和 os.Create 等函数操作文件。

打开文件(只读):

go 复制代码
file, err := os.Open("test.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

创建文件(写入):

go 复制代码
file, err := os.Create("output.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close()
  • • os.Create:若文件已存在则清空内容;不存在则创建。
  • • defer file.Close():确保函数退出时关闭文件,释放资源。

二、文件读取

1. 读取整个文件内容(os.ReadFile):

lua 复制代码
data, err := os.ReadFile("test.txt")
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(data))

2. 逐行读取(bufio.Scanner):

css 复制代码
file, _ := os.Open("test.txt")
defer file.Close()

scanner := bufio.NewScanner(file)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}
  • • Scanner 适合按行读取大文件。
  • • 可以自定义分割符(如按词、段落等)。

3. 使用 Read 方法读取固定字节:

go 复制代码
buf := make([]byte, 100)
n, err := file.Read(buf)
fmt.Printf("Read %d bytes: %s\n", n, buf[:n])

三、文件写入

1. 写入字符串或字节(WriteString / Write):

css 复制代码
file, _ := os.Create("output.txt")
defer file.Close()

file.WriteString("Hello, Go!\n")
file.Write([]byte("Second line\n"))

2. 使用 bufio.Writer 缓冲写入:

css 复制代码
file, _ := os.Create("buffered.txt")
defer file.Close()

writer := bufio.NewWriter(file)
writer.WriteString("Buffered write\n")
writer.Flush() // 必须手动 flush

四、追加写入(os.OpenFile)

如果想向文件追加内容,可使用如下方式:

lua 复制代码
file, _ := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
defer file.Close()

file.WriteString("New log entry\n")
  • • 常见标志位:
    • • os.O_RDONLY:只读
    • • os.O_WRONLY:只写
    • • os.O_RDWR:读写
    • • os.O_APPEND:追加
    • • os.O_CREATE:创建
    • • os.O_TRUNC:清空原内容

五、复制文件内容(使用 io.Copy)

css 复制代码
src, _ := os.Open("src.txt")
dst, _ := os.Create("dst.txt")
defer src.Close()
defer dst.Close()

io.Copy(dst, src)
  • • io.Copy 是复制文件内容的简洁高效方式。

六、常见错误处理技巧

  • • 一定要 关闭文件 :使用 defer。
  • • 检查 err:防止 panic。
  • • 注意文件权限,UNIX 系统中建议使用 0644。

七、小结

操作 推荐方式
读完整文件 os.ReadFile
按行读取 bufio.Scanner
写文件 os.Create + Write / Writer
追加写入 os.OpenFile + O_APPEND
拷贝文件 io.Copy

相关推荐
SamDeepThinking2 分钟前
CyclicBarrier的底层实现
java·后端·面试
god_cvz2 分钟前
第二章:6、对话记忆与引用标注
后端·ai编程
拖孩3 分钟前
全程 AI 写的小程序,刚接上会员虚拟支付,上线第二天就有人真金白银买单了|双签名、定价、iOS 的坑我全踩了一遍
前端·后端·微信小程序
我是人✓3 分钟前
SpringMVC异常处理与拦截器实战揭秘
java·开发语言·后端
仟里码4 分钟前
九:goroutine(1.什么是协程)
后端
不是万能的豆学长13 分钟前
排查Go服务40天后的内存泄漏问题
开发语言·后端·golang·go
阿狗童鞋14 分钟前
SpringSecurity权限认证实战指南
java·后端·spring
韩振方17 分钟前
Kubernetes Service 让会更换的 Pod 有稳定访问入口
后端
用户1257585243618 分钟前
Golang后台管理框架推荐:XYGo Admin与devinggo怎么选?
后端·go·ai编程
仟里码18 分钟前
十一:goroutine(3. select基本使用)
后端