为什么Go vet会提示已赋值的变量b存在声明但未使用的问题?
问题原因
这个警告符合Go的语法规则和vet的检测逻辑,核心原因是:Go语言中仅对变量赋值不算「使用」变量,只有读取变量的值才算使用。
具体可以拆解为以下几点:
- Go语言规范明确要求,函数内部声明的局部变量必须被使用,此处的「使用」特指变量出现在取值类的表达式中,单纯的赋值操作不被计入使用范畴。
- 你给出的代码中,变量
b仅在闭包内做了b = 12的赋值操作,全程没有任何地方读取b的值,这个赋值操作不会产生任何可观测的外部效果,整个变量b的存在没有实际意义,因此vet判定它属于「声明但未使用」的范畴。 - 闭包捕获变量的逻辑不会影响上述判定规则:哪怕闭包会修改外部变量的值,只要没有对该变量的读取操作,依然会被判定为未使用。
如果要消除这个警告,只要在任意位置增加对b的读取操作即可,示例如下:
package main func a(fn func()) { fn() } func main() { var b int a(func() { b = 12 }) println(b) // 新增读取b的操作,警告自动消失 }
内容的提问来源于stack exchange,提问作者Nathan Osman
相关产品推荐
相关产品推荐

