一次性读取文件
概念说明
os.ReadFile 会一次性把文件内容读入内存。
它适合读取配置文件、小文本文件等体积较小的内容。
如果文件很大,不建议一次性读取。
这时应考虑分片读取或带缓冲读取。
语法/规则
- 使用
os.ReadFile(path)读取文件。 - 返回值是
[]byte和error。 - 需要文本内容时,可以把
[]byte转成string。 - 读取失败时应检查
err。 - 大文件读取要避免一次性占用过多内存。
一次性读取示例
| |
输出结果:
| |
代码解析:
- 准备文件路径
| |
这一步是先定义文件名。后面写文件、读文件、删文件,都会用到这个 path。
- 写入示例文件
| |
这一段的作用是:先创建一个文件,并往里面写入内容,方便后面演示“读取文件”。
这行代码可以拆开理解:
path表示要写入的文件路径,这里就是note.txt。[]byte("hello go")表示把字符串"hello go"转成字节切片。 因为os.WriteFile需要的不是字符串,而是[]byte类型的数据。0644表示文件权限。初学阶段可以先简单记成:文件所有者可读可写,其他人只读。
如果文件不存在,os.WriteFile 会先创建文件。
如果文件已经存在,os.WriteFile 会用新内容覆盖旧内容。
if err != nil { panic(err) } 是错误处理,表示如果写入失败,就直接报错停止。
- 延迟删除示例文件
| |
这一段特别容易让人疑惑,可以拆成两部分看:
os.Remove(path)表示删除path对应的文件,也就是删除note.txt。defer表示现在先不执行,等main函数快结束时再执行。
所以这一整行的意思是:
先把“删除 note.txt”这件事记下来,等程序把后面的读取和输出都做完以后,再自动把这个示例文件删掉。
这样做的好处是:示例运行完之后,不会在目录里留下一个临时测试文件。
- 一次性读取文件内容
| |
这一段表示把 note.txt 里的内容一次性全部读出来,并保存到变量 data 中。
这里的 data 类型仍然是 []byte,因为 Go 读取文件时,拿到的本质上是字节数据。
如果读取失败,同样会通过 if err != nil 直接报错。
- 输出读取到的内容
| |
data 是 []byte,不能直接当普通字符串看,所以这里先用 string(data) 把字节切片转成字符串,再输出。
因此最终打印结果就是:
| |
常见错误
- 读取大文件仍使用
os.ReadFile,导致内存压力过大。 - 忽略读取错误,导致后续处理空数据或旧数据。
- 忘记
[]byte和string的区别,直接打印字节切片得到数字列表。