未使用的变量将阻止编译(这是一件好事),但是编译器并不真正在乎未使用的函数,有解释吗?
变量和函数之间的行为似乎是一致的,即使在未使用的情况下,也都可以在包级范围内使用它们。
该代码段正在编译,没有任何问题:
package main
var v int // unused variable
func f() {} // unused function
func main() {}
现在,当涉及局部作用域时,情况有所不同,未使用的变量会产生错误。与函数文字相同(Go中不允许使用命名嵌套函数):
func main() {
func() {}
}
// Error: func literal evaluated but not used
最后,为什么只检查局部作用域中未使用的变量?因为通常是一个错误(例如,在Go中,由于意外使用:=
)。编译器在这里救了我很多次。考虑一下:
func f() (err error) {
if somthing {
err := g() // err is unused variable! I really meant `=`.
}
return
}
对于全局(包级)作用域,未使用的变量和函数通常只是污染名称空间,例如,有人忘记在重构后将其删除。有一些工具可以帮助检测这些,例如:
我最近一直在用gcc -Wall -Werror编写一些C代码。当您只是想测试到目前为止的内容,或者注释掉可能造成麻烦的调用时,使原型代码在某种程度上很难被告知“您没有使用该功能,请对其进行修复”。当然,对于未使用的局部变量的警告也是如此。区别在于,在Go中,由于:=,未使用的局部变量通常是一个错误,而未使用的未导出函数则很少是一个错误。
拉斯
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句