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

2024-03-25

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


变量和函数之间的行为似乎是一致的——即使未使用,两者都允许在包级范围内使用。

此代码片段编译没有任何问题:

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 https://github.com/opennota/check
  2. https://github.com/alectomas/gometalinter https://github.com/alecthomas/gometalinter(使用之前的包)
  3. https://github.com/remyudomphheng/go-misc/blob/master/deadcode/deadcode.go https://github.com/remyoudompheng/go-misc/blob/master/deadcode/deadcode.go

我还找到了一个拉斯·考克斯发表的文章 https://groups.google.com/d/msg/golang-nuts/Mo9gZDkg9vw/F23ZRPKVF_MJ对这个问题的评论:

我最近一直在用 gcc -Wall -Werror 编写一些 C 代码。它 使得原型代码有点难以被告知“你没有使用 当你只是想测试你的功能时,去修复它” 到目前为止,或注释掉可能造成麻烦的呼叫。 当然,对于未使用的局部变量的警告也是如此 也。不同之处在于,在 Go 中,由于 := ,一个未使用的本地 变量通常是一个错误,而未使用的未导出函数是 更不用说是错误了。

Russ

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们可以有未使用的函数,但不能有未使用的变量? 的相关文章

随机推荐