新功能可能会涵盖所有内容,但是核心软件包的工作尚未停止。

在Go技术负责人Russ Cox的提议中,很容易看出弃用的动机:

像大多数名称中带有util的东西一样,io / ioutil被定义为定义不清晰且难以理解的东西集合。

在一系列的几个 变化,整个ioutil包是由于从开始变得过时围棋1.16。

现有的代码使用ioutil将继续有效; ioutil将由驻留在io和os包中的新函数的简单包装组成。

最初,Cox早在7月份就批准了一项提案,该提案看到一般I / O助手(例如ioutil.ReadAll,从软件包中移出ioutil并移入)io。

剩余的代码ioutil由OS文件系统助手组成,例如ReadFile。几个月后,Cox提出了第二个建议,建议将这些组件打包os。接受提议是ioutil棺材里的钉子。

弃用ioutil是重要的Go版本的一部分。默认情况下,启用模块感知模式。该darwin/arm64端口将被释放,这意味着Go可以使用其M1 SoC在苹果的新Mac上获得本地支持。去年演示的新io/fs程序包将首次亮相。

尽管新功能往往会获得更多的新闻报道,但长期以来围棋程序员可能会因最近的弃用而受到鼓舞。诸如此类的相对不费吹灰之力的工作表明我们致力于保持语言的核心简洁易懂。一开始就吸引了许多程序员使用这种语言的价值观。

迁移示例
使用代码的迁移ioutil应该很简单。这是从wal流行的Prometheus项目中的包改编而成的示例迁移:

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。现在ioutil不再需要它,并且os已经将其导入,我们有了一个更少的依赖关系:

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))
}()

Go团队的成员Bryan Mills为该命令提供了一个开放的建议,go fix以自动迁移不推荐使用的代码。这意味着ioutil可能不必手动更改使用的现有代码。对该提案的讨论已于一年前停滞不前。今年晚些时候可能会要求提案审核委员会提供其他反馈。