快报:Go 1.16 将会废弃 io/ioutil 包!

共 1684字,需浏览 4分钟

 ·

2021-01-23 09:30

其实 20 年 10 月份,Go 掌舵人 Russ Cox 已经有废弃 ioutil 包的提案[1],废弃原因是:

io/ioutil, like most things with util in the name, has turned out to be a poorly defined and hard to understand collection of things.

后续的几次代码提交也证实了这一点,从 Go 1.16 开始会废弃 io/ioutil 包,相关的功能会挪到 io 包或 os 包。

提交记录 io[2]、 os[3]




问题 1:升级 Go 版本有影响吗?

为了便于版本升级,保持兼容性,ioutil 函数依旧会保留,但实际上调用的是 io、os 包里的函数。

可以看下 1.16 版本的代码:

// As of Go 1.16, this function simply calls io.ReadAll.func ReadAll(r io.Reader) ([]byte, error) {    return io.ReadAll(r)}
// As of Go 1.16, this function simply calls os.ReadFile.func ReadFile(filename string) ([]byte, error) { return os.ReadFile(filename)}


问题 2:如何迁移?

之后如果需要升级到 1.16 版本,迁移代码也很简单,比如 Prometheus 项目中的 wal 包使用了 ioutil 包,就可以这样升级:

package wal
import ( "fmt" "io/ioutil" "os" ...)
func TestLastCheckpoint(t *testing.T) { dir, err := ioutil.TempDir("", "test_checkpoint") require.NoError(t, err) defer func() { require.NoError(t, os.RemoveAll(dir)) }()...

只需要将 ioutil.TempDir 改成 os.MkDirTemp。

package wal
import ( "fmt" "os" ...)
func TestLastCheckpoint(t *testing.T) { dir, err := os.MkDirTemp("", "test_checkpoint") require.NoError(t, err) defer func() { require.NoError(t, os.RemoveAll(dir)) }()...

就可以不用导入 ioutil 包。


更多信息可以查看文末 阅读原文

References

[1] 提案: https://github.com/golang/go/issues/42026
[2] io: https://go-review.googlesource.com/c/go/+/263141/
[3] os: https://go-review.googlesource.com/c/go/+/266364/



推荐阅读


福利

我为大家整理了一份从入门到进阶的Go学习资料礼包,包含学习建议:入门看什么,进阶看什么。关注公众号 「polarisxu」,回复 ebook 获取;还可以回复「进群」,和数万 Gopher 交流学习。

浏览 90
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报