为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
一只甜甜圈 2021-11-22 17:00:51
未使用的变量会阻止编译(这是一件好事)但编译器并不真正关心未使用的函数,有解释吗?
查看完整描述

1 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

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


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


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

}

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


https://github.com/opennota/check

https://github.com/alectomas/gometalinter(使用之前的包)

https://github.com/remyoudompheng/go-misc/blob/master/deadcode/deadcode.go

我还发现了Russ Cox对这个问题的评论:


我最近一直在用 gcc -Wall -Werror 编写一些 C 代码。当您只是尝试测试到目前为止所拥有的内容或注释掉可能会引起问题的调用时,它会使原型代码变得有些难以被告知“您没有使用该功能,去修复它”。当然,对于未使用的局部变量的警告也是如此。不同之处在于,在 Go 中,由于 :=,未使用的局部变量通常是一个错误,而未使用的未导出函数则很少是错误。


拉斯


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 235 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信