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

点击上方蓝色“Golang来啦”关注我哟

加个“星标”,天天 15 分钟,掌握 Go 语言

其实 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 语言常见的坑

不要使用 Go 默认的 HTTP 客户端(在生产环境中)

如果我的文章对你有所帮助,点赞、转发都是一种支持!

给个[在看],是对四哥最大的支持
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seekload

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值