IT资讯 Go 1.15 将为 Vet 引入新的检查内容

robbie · 2020-02-10 14:00:05 · 热度: 9

虽然 Go 1.14 尚未发布(计划于 2 月发布),不过 Robert Griesemer(Go 语言核心维护者兼创始人之一) 已在博客公布了 Go 1.15 开发提案

Robert 提到,在审查了所有可行的提案后,由于团队各成员一致认为不希望在没有长期计划的情况下逐渐增加新功能,因此经过考量后,决定不在 Go 1.15 加入重大变更,取而代之的是为 go vet 增加两个检查内容,包括在go vet中对string(int)转换进行诊断,以及对 interface-interface 类型断言的诊断。还有一个提案是使用常量字符串和索引进行常量求值索引和切片表达式(slice expressions)。

团队原计划在 Go 1.14 版本的go vet加入诊断string(int)转换的功能,但因为面临着上线 1.14 的 deadline,所以唯有将此功能推迟至 Go 1.15 上线。string(int)转换是 Go 在早期加入的功能,但因为有可能会让新手感到疑惑,且 unicode/utf8 套件现已提供该转换功能,而且移除该转换功能会导致向后兼容性出现问题,因此团队决定将此功能引入至go vet

下面了解一下 Go 1.15 的三个提案:

#32479. 在go vet中对string(int)转换进行诊断

团队原本计划在即将发布的 Go 1.14 实现此项功能,但最后由于存在未解决的问题,所以推迟至在 Go 1.15 中上线该功能。string(int)转换是在 Go 早期加入的功能,但它会让新手感到疑惑(例如string(10) 的值为 "\n" 而不是 "10"),而且现在可在unicode/utf8中使用此功能,所以也就没有使用它的理由了。不过由于删除此功能不是向后兼容的更改,因此团队决定在go vet中加入对string(int)转换的诊断。

#4483. 在go vet中加入对 interface-interface 类型断言的诊断

目前,Go 允许存在任意类型的断言x.(T)(和相应类型的 switch case),其中xT的类型是接口。然而,如果这两个xT具有相同名称但不同签名的方法,我们不可能为x指派任何值以实现T。这种类型的断言将始终在 runtime 阶段 false(或出现 panic 和被评估为 false)。由于在编译时就已知道这种情况,因此编译器也可能会报告错误。在这种情况下,报告编译器错误不是向后兼容的更改,因此团队也决定在go vet中加入对 interface-interface 类型断言的诊断。

#28591. 使用常量字符串和索引进行常量求值索引和切片表达式(slice expressions)

用一个或多个常量索引对常量字符串进行索引或切片会分别产生一个非常量的bytestring值。但是,如果所有操作数都是常量,则编译器可以对这些表达式进行常量求值,并产生常量(可能是无类型的)结果。这是完全向后兼容的更改,团队建议对规范和编译器进行必要的调整。

(更正:在发布后团队发现此更改不向后兼容;有关详细信息,请参见注释

至于 Go 的三大难题:包/版本管理、错误处理以及泛型,去年 7 月官方曾试图推动转变错误处理机制,但这引起很大的争议,最后官方决定放弃该提案,而后又有很多建议,但都不足以说服他们新建议比原先的提案更好,因此目前暂时将错误处理功能先行搁置,待未来有更好的解决方案再决定。

Go 团队还提到他们收到的语言变更建议,远比他们能够审核的数量多上不少,光错误处理就有 57 个 issue。团队表示,因为语言更改的成本很高,而且无法了解所带来的收益,因此大多数关于语言变更的提案都会被拒绝。为了减少审核委员会的负担,团队新增了语言变更调查表(https://github.com/golang/proposal/blob/master/go2-language-changes.md),社区成员填写该表将能够让提案审核更有效率。

猜你喜欢:
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册