未使用的变量会阻止编译(这是一件好事)但编译器并不关心未使用的函数,是否有解释?
答案 0 :(得分:2)
变量和函数之间的行为似乎是一致的 - 即使未使用,也允许在包级范围内使用。
此代码段正在编译,没有任何问题:
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
}
对于全局(包级)范围,未使用的变量和函数通常只是污染命名空间,例如,有人在重构后忘记删除它们。有一些工具可以帮助检测这些,例如:
我还发现了post by Russ Cox对此问题的评论:
我最近用gcc -Wall -Werror编写了一些C代码。它 使原型代码有点难以被告知“你没有使用 这个功能,当你只是试图测试你的东西时,去解决它 到目前为止,或评论可能导致麻烦的电话。 当然,对于未使用的局部变量的警告也是如此 太。不同之处在于,在Go中,因为:=,一个未使用的本地 变量通常是一个bug,而未使用的未导出函数是 更不经常是一个错误。
拉斯