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

相关推荐
你的人类朋友7 小时前
说说签名与验签
后端
databook7 小时前
Manim实现脉冲闪烁特效
后端·python·动效
canonical_entropy11 小时前
AI时代,我们还需要低代码吗?—— 一场关于模型、演化与软件未来的深度问答
后端·低代码·aigc
颜如玉11 小时前
HikariCP:Dead code elimination优化
后端·性能优化·源码
考虑考虑12 小时前
Jpa使用union all
java·spring boot·后端
bobz96513 小时前
virtio vs vfio
后端
Rexi13 小时前
“Controller→Service→DAO”三层架构
后端
bobz96513 小时前
计算虚拟化的设计
后端
深圳蔓延科技14 小时前
Kafka的高性能之路
后端·kafka
Barcke14 小时前
深入浅出 Spring WebFlux:从核心原理到深度实战
后端