Go语言中闭包赋值局部变量仍提示未使用的原因探究
为什么局部变量foo会触发“declared and not used”错误?
这是Go编译器对全局变量和局部变量的未使用检查规则不同导致的:
全局变量场景:第一个代码里的
foo是包级全局变量,Go编译器不会检查全局变量是否被使用。因为全局变量可能被其他包的代码引用,单包编译阶段无法确认其是否有实际用途,所以即使只对它赋值而不读取,也不会触发报错。局部变量场景:第二个代码里的
foo是main函数内的局部变量,Go对局部变量的使用检查非常严格——仅仅赋值不算“使用”,必须有读取操作才算。这里匿名函数只是给foo赋值,但整个main函数里没有任何地方读取foo的值,编译器就会判定它“声明后未使用”,抛出对应的错误。
如果想让第二个代码通过编译,只需要在调用fn()之后添加读取foo的操作就行,比如:
func main() { var foo string fn := func() { foo = "AAA" } fn() println(foo) // 读取foo,满足“使用”条件 }
内容的提问来源于stack exchange,提问作者Greendrake
相关产品推荐
相关产品推荐

