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

误区:

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

托马斯:

变量和函数之间的行为似乎是一致的,即使在未使用的情况下,也都可以在包级范围内使用它们。

该代码段正在编译,没有任何问题:

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

我还发现了Russ Cox对此问题发表评论帖子

我最近一直在用gcc -Wall -Werror编写一些C代码。当您只是想测试到目前为止的内容,或者注释掉可能造成麻烦的调用时,使原型代码在某种程度上很难被告知“您没有使用该功能,请对其进行修复”。当然,对于未使用的局部变量的警告也是如此。区别在于,在Go中,由于:=,未使用的局部变量通常是一个错误,而未使用的未导出函数则很少是一个错误。

拉斯

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们不能使用构造函数本身来初始化servlet?

为什么我们可以使用数组快速返回多个值时使用元组

为什么我们不能使用GetConstructor找到Int32的默认构造函数?

为什么我们不能使用表达式强健的构造函数?

为什么我们不能使用。作为带有%>%的匿名函数中的参数

为什么我们不能使用ES6箭头函数创建原型?

为什么我们不能使用new关键字创建活动?

为什么可以使用void()但不能使用void {}?

为什么我们不能使用aiohttp为生产提供静态文件?

为什么我们不需要使用“ require”语句,但仍然可以使用内置函数?

为什么我可以使用Firefox或WGET访问网站,但不能使用CURL或Ruby

为什么我们不能使用push方法来迭代javascript数组?

为什么我们不能使用忽略的可选参数调用委托实例?

REST为什么我们不能使用字符作为查询参数

为什么我们可以使用$ this实例化不存在的变量

为什么我们不能使用rank()分析函数删除表中的重复项?

为什么我的程序不能使用float变量,但是可以使用int变量?

为什么我们不能使用动态方法代替Generic(T)方法

为什么我们不能使用192.168.1作为子网掩码

为什么我们不能使用C中的表达式为全局变量赋值?

如果我们可以使用访问器访问私有数据成员,那么为什么我们不能访问私有方法呢?

CentOS,我们可以使用哪些存储库,为什么要使用它们?

为什么在我们可以使用简单的 return 语句时使用了函数表达式

为什么我们不能使用scanf直接初始化struct中的变量?

为什么我们可以在 if 循环中使用分号,而在 while 循环中不能使用分号

为什么我不能使用 pip 安装 cudatookkit=10.1 但可以使用 conda?

为什么我们不能使用由 DOM getElementsByClassName 选择的变量的 addEventListener ?

为什么我们不能使用两个不同的 enum Interchangeable?,例如作为函数参数?

如果无法编译未使用的函数,则模板类可以使用 C++17 编译,但不能使用 C++20 编译