为什么 'new' 和 'make' 不是保留关键字?
Why are 'new' and 'make' not reserved keywords?
启用语法高亮显示后,在阅读像 answer to this question 这样使用 new 作为变量名的代码时会分散注意力。
我在想一个原因,为什么只有一部分关键字会被保留而不能想出一个好的。
编辑:此问题的备用标题:
为什么不保留 Go 的预声明标识符?
那是因为 new
和 make
并不是真正的关键字,而是内置函数。
如果您检查 full list of the reserved keywords,您也不会看到 len
或 cap
...
简而言之:因为 在您自己的声明中使用 predeclared identifiers 不会使您的代码 模棱两可。
new
和 make
是内置函数,等等。请参阅 builtin
包的文档中的完整列表。
Keywords 是一小组精心挑选的保留字。您不能使用关键字作为标识符,因为这可能会使对您的来源的解释变得模棱两可。
内置函数是特殊函数:您可以在没有任何导入的情况下使用它们,并且它们可能有不同的参数和 return 列表。您可以使用内置函数的名称声明函数或变量,因为您的代码 仍将保持明确:您在范围内的标识符将“获胜”。
如果您使用关键字作为标识符,您将无法访问您的实体,因为尝试通过其名称引用它总是意味着 关键字 而不是您的标识符。
查看这个使用内置函数 make
和内置类型 int
的预声明标识符的肮脏示例(不推荐用于生产代码)(在 Go Playground 上尝试) :
make := func() string {
return "hijacked"
}
int := make() // Completely OK, variable 'int' will be a string
fmt.Println(int) // Prints "hijacked"
如果可以使用关键字作为标识符,即使解释声明也会让编译器头疼:以下是什么意思?
func()
- 它是在调用名为 func
的函数,还是没有参数且没有 return 类型的 type 函数?
import()
- 它是分组导入声明(并且什么都不导入)还是调用我们名为 import
的函数?
- ...
启用语法高亮显示后,在阅读像 answer to this question 这样使用 new 作为变量名的代码时会分散注意力。
我在想一个原因,为什么只有一部分关键字会被保留而不能想出一个好的。
编辑:此问题的备用标题:
为什么不保留 Go 的预声明标识符?
那是因为 new
和 make
并不是真正的关键字,而是内置函数。
如果您检查 full list of the reserved keywords,您也不会看到 len
或 cap
...
简而言之:因为 在您自己的声明中使用 predeclared identifiers 不会使您的代码 模棱两可。
new
和 make
是内置函数,等等。请参阅 builtin
包的文档中的完整列表。
Keywords 是一小组精心挑选的保留字。您不能使用关键字作为标识符,因为这可能会使对您的来源的解释变得模棱两可。
内置函数是特殊函数:您可以在没有任何导入的情况下使用它们,并且它们可能有不同的参数和 return 列表。您可以使用内置函数的名称声明函数或变量,因为您的代码 仍将保持明确:您在范围内的标识符将“获胜”。
如果您使用关键字作为标识符,您将无法访问您的实体,因为尝试通过其名称引用它总是意味着 关键字 而不是您的标识符。
查看这个使用内置函数 make
和内置类型 int
的预声明标识符的肮脏示例(不推荐用于生产代码)(在 Go Playground 上尝试) :
make := func() string {
return "hijacked"
}
int := make() // Completely OK, variable 'int' will be a string
fmt.Println(int) // Prints "hijacked"
如果可以使用关键字作为标识符,即使解释声明也会让编译器头疼:以下是什么意思?
func()
- 它是在调用名为func
的函数,还是没有参数且没有 return 类型的 type 函数?import()
- 它是分组导入声明(并且什么都不导入)还是调用我们名为import
的函数?- ...