os.readfile 替代 ioutil.readfile 行为一致但路径需预创建,io.readall 替代 ioutil.readall 无性能差异,os.mkdirtemp/createtemp 要求非空目录且权限更严格,os.readdir 返回 fs.direntry 需显式调用 info() 获取完整信息。

os.ReadFile 替代 ioutil.ReadFile:替换后行为一致,但权限和路径更严格
直接把 ioutil.ReadFile 换成 os.ReadFile 即可,签名、返回值、错误类型完全一样。但别以为只是改个包名就万事大吉——它不会帮你创建父目录,路径里任何一级不存在都会报 no such file or directory。
- 必须提前用
os.MkdirAll("a/b/c", 0o755)确保路径存在,否则直接 panic - 读取失败时仍可用
os.IsNotExist(err)判断,这点没变 - 不支持大文件:和旧版一样,整个文件进内存,100 MB 文件可能吃掉 200+ MB 堆内存
io.ReadAll 替代 ioutil.ReadAll:性能无差异,底层就是同一段代码
ioutil.ReadAll 在 Go 1.16+ 已被移除,但它的实现体早就只是简单调用 io.ReadAll。替换后不仅没性能损失,还少了一层函数跳转。
- 两者缓冲区策略一致:初始 512 字节,动态扩容,最大步进 64 KB
- 错误处理逻辑相同,
io.EOF被转为nil - 如果你还在 import
"io/ioutil",删掉——否则gopls或staticcheck会直接标红
os.MkdirTemp 和 os.CreateTemp:第一个参数不能为空,权限默认更安全
os.MkdirTemp 替代 ioutil.TempDir,os.CreateTemp 替代 ioutil.TempFile,但签名细节容易写错。
-
os.MkdirTemp("", "prefix")会 panic:mkdir: invalid argument;必须显式传os.TempDir() -
os.CreateTemp默认权限是0o600(仅属主可读写),比旧版更保守 - 临时文件/目录创建后不会自动清理,
defer os.Remove(f.Name())或os.RemoveAll(tmpDir)得自己加
os.ReadDir 替代 ioutil.ReadDir:返回 fs.DirEntry,不是 os.FileInfo
ioutil.ReadDir 没有直接平移函数,得用 os.ReadDir,但返回类型变了——不再是 []os.FileInfo,而是 []fs.DirEntry。
-
fs.DirEntry是轻量接口,支持Name()、IsDir()、Type(),但不带ModTime()或Size() - 需要完整信息时,得显式调用
e.Info()(会触发一次系统调用) - 如果原来代码依赖
sort.Slice(files, func(i, j int) bool { return files[i].ModTime().Before(files[j].ModTime()) }),现在要改成先.Info()再排序
dir 参数、权限漏写 0o 前缀、大文件读取不设限、临时资源忘了清理——这些在 CI 或生产环境里才突然冒头。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











