章节

14.1 一次性读取文件

本篇学习 os.ReadFile 的一次性读取方式,并能读取小文件内容。

一次性读取文件

概念说明

os.ReadFile 会一次性把文件内容读入内存。
它适合读取配置文件、小文本文件等体积较小的内容。

如果文件很大,不建议一次性读取。
这时应考虑分片读取或带缓冲读取。

语法/规则

  1. 使用 os.ReadFile(path) 读取文件。
  2. 返回值是 []byteerror
  3. 需要文本内容时,可以把 []byte 转成 string
  4. 读取失败时应检查 err
  5. 大文件读取要避免一次性占用过多内存。

一次性读取示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
	"fmt"
	"os"
)

func main() {
	path := "note.txt"
	err := os.WriteFile(path, []byte("hello go"), 0644) // 写入示例文件
	if err != nil {
		panic(err)
	}
	defer os.Remove(path) // 函数结束前删除示例文件

	data, err := os.ReadFile(path) // 一次性读出全部内容
	if err != nil {
		panic(err)
	}

	fmt.Println(string(data)) // []byte 转成 string 后输出
}

输出结果:

1
hello go

代码解析:

  1. 准备文件路径
1
path := "note.txt"

这一步是先定义文件名。后面写文件、读文件、删文件,都会用到这个 path

  1. 写入示例文件
1
2
3
4
err := os.WriteFile(path, []byte("hello go"), 0644)
if err != nil {
	panic(err)
}

这一段的作用是:先创建一个文件,并往里面写入内容,方便后面演示“读取文件”。

这行代码可以拆开理解:

  • path 表示要写入的文件路径,这里就是 note.txt
  • []byte("hello go") 表示把字符串 "hello go" 转成字节切片。 因为 os.WriteFile 需要的不是字符串,而是 []byte 类型的数据。
  • 0644 表示文件权限。初学阶段可以先简单记成:文件所有者可读可写,其他人只读。

如果文件不存在,os.WriteFile 会先创建文件。 如果文件已经存在,os.WriteFile 会用新内容覆盖旧内容。

if err != nil { panic(err) } 是错误处理,表示如果写入失败,就直接报错停止。

  1. 延迟删除示例文件
1
defer os.Remove(path)

这一段特别容易让人疑惑,可以拆成两部分看:

  • os.Remove(path) 表示删除 path 对应的文件,也就是删除 note.txt
  • defer 表示现在先不执行,等 main 函数快结束时再执行。

所以这一整行的意思是: 先把“删除 note.txt”这件事记下来,等程序把后面的读取和输出都做完以后,再自动把这个示例文件删掉。

这样做的好处是:示例运行完之后,不会在目录里留下一个临时测试文件。

  1. 一次性读取文件内容
1
2
3
4
data, err := os.ReadFile(path)
if err != nil {
	panic(err)
}

这一段表示把 note.txt 里的内容一次性全部读出来,并保存到变量 data 中。

这里的 data 类型仍然是 []byte,因为 Go 读取文件时,拿到的本质上是字节数据。

如果读取失败,同样会通过 if err != nil 直接报错。

  1. 输出读取到的内容
1
fmt.Println(string(data))

data[]byte,不能直接当普通字符串看,所以这里先用 string(data) 把字节切片转成字符串,再输出。

因此最终打印结果就是:

1
hello go

常见错误

  1. 读取大文件仍使用 os.ReadFile,导致内存压力过大。
  2. 忽略读取错误,导致后续处理空数据或旧数据。
  3. 忘记 []bytestring 的区别,直接打印字节切片得到数字列表。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字