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

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


一、打开与关闭文件

Go 使用 os.Openos.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

相关推荐
uzong2 小时前
Mermaid: AI 时代画图的魔法工具
后端·架构
q***69773 小时前
Spring Boot与MyBatis
spring boot·后端·mybatis
IUGEI4 小时前
synchronized的工作机制是怎样的?深入解析synchronized底层原理
java·开发语言·后端·c#
间彧4 小时前
GraalVM Native Image:跨平台能力与编译模式深度解析
后端
间彧4 小时前
GraalVM Native Image 与传统 JVM 内存管理:云原生时代的技术选型指南
后端
r***12384 小时前
SpringBoot最佳实践之 - 使用AOP记录操作日志
java·spring boot·后端
b***74884 小时前
前端GraphQL案例
前端·后端·graphql
猿小猴子5 小时前
主流 AI IDE 之一的 Google Antigravity IDE 介绍
ide·人工智能·google·antigravity
LSL666_5 小时前
SpringBoot自动配置类
java·spring boot·后端·自动配置类
q***78375 小时前
Spring Boot 3.X:Unable to connect to Redis错误记录
spring boot·redis·后端