
上QQ阅读APP看书,第一时间看更新
2.5 未使用的变量
Go语言的初衷之一是使大型团队更容易在程序上进行协作。为此,Go拥有一些其他编程语言没有的规则。比如在第1章中,我们看到需要使用特有的工具go fmt
对代码进行标准的格式化[1]。还有就是Go要求每个声明的局部变量必须被读取(read),声明局部变量而不读取其值会导致编译时错误。
但是编译器无法对未使用的变量进行全面且详尽的检查,只要变量被读取一次,哪怕仅仅对变量进行了写操作(write)后再也没有读取变量的值,编译器也不会报错。下面的代码是可运行的Go程序:

尽管这段代码正常通过编译,而且go vet
也通过检查,但是使用golangci-lint
可以检测到错误:

Go语言编译器无法检查出包级别的未读变量,所以应该避免创建包级别的未读变量。
未使用的常量
可能你会感到惊讶,Go语言编译器允许使用const
创建未读常量,这是因为在编译时常量的值就被计算,而且之后不会修改,所以不会带来未知的副作用。这意味着这些未使用的常量易于被消除:既然常量没有使用,它就不会包含在编译后的二进制文件里。
[1]Go语言的代码实现也使用这种统一的标准代码风格。