为什么我们可以使用未使用的函数但我们不能使用未使用的变量?

时间:2015-11-17 09:35:54

标签: performance go compilation

未使用的变量会阻止编译(这是一件好事)但编译器并不关心未使用的函数,是否有解释?

1 个答案:

答案 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
}

对于全局(包级)范围,未使用的变量和函数通常只是污染命名空间,例如,有人在重构后忘记删除它们。有一些工具可以帮助检测这些,例如:

  1. https://github.com/opennota/check
  2. https://github.com/alecthomas/gometalinter(使用上一个包)
  3. https://github.com/remyoudompheng/go-misc/blob/master/deadcode/deadcode.go
  4. 我还发现了post by Russ Cox对此问题的评论:

      

    我最近用gcc -Wall -Werror编写了一些C代码。它   使原型代码有点难以被告知“你没有使用   这个功能,当你只是试图测试你的东西时,去解决它   到目前为止,或评论可能导致麻烦的电话。   当然,对于未使用的局部变量的警告也是如此   太。不同之处在于,在Go中,因为:=,一个未使用的本地   变量通常是一个bug,而未使用的未导出函数是   更不经常是一个错误。

         

    拉​​斯