Go语言规范language specification 概述了几个内置的,
不应在Go项目中使用的名称标识predeclared identifiers。
根据上下文的不同,将这些标识符作为名称重复使用,
将在当前作用域(或任何嵌套作用域)中隐藏原始标识符,或者混淆代码。
在最好的情况下,编译器会报错;在最坏的情况下,这样的代码可能会引入潜在的、难以恢复的错误。
Bad | Good |
var error string
func handleErrorMessage(error string) {
}
|
var errorMessage string
func handleErrorMessage(msg string) {
}
|
type Foo struct {
// 虽然这些字段在技术上不构成阴影,但`error`或`string`字符串的重映射现在是不明确的。
error error
string string
}
func (f Foo) Error() error {
// `error` 和 `f.error` 在视觉上是相似的
return f.error
}
func (f Foo) String() string {
// `string` and `f.string` 在视觉上是相似的
return f.string
}
|
type Foo struct {
err error
str string
}
func (f Foo) Error() error {
return f.err
}
func (f Foo) String() string {
return f.str
}
|
注意,编译器在使用预先分隔的标识符时不会生成错误,
但是诸如go vet
之类的工具会正确地指出这些和其他情况下的隐式问题。
最后编辑: kuteng 文档更新时间: 2021-05-09 20:12 作者:kuteng