Golang语言-变量隐藏(shadowing)

Posted by Shi Hai's Blog on June 11, 2024

背景介绍

:=是一个简短变量声明,通过此符号我们可以定义一个变量并进行赋值。Golang语言的一个指导设计原则就是让语法更整洁。比如:我们在iffor等语句中定义本地变量。但使用此申明有一个风险,那就是作用域范围。如果使用不当可能会导致变量屏蔽(shadowing)。

检测手段

package main

func main() {
    x := 1
    println(x)        // 1
    {
        println(x)    // 1
        x := 2
        println(x)    // 2    // 新的x变量的作用域只在代码块内部
    }
    println(x)        // 1
}

我们可以通过安装shadow工具来检测此问题。

go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow@latest

执行此工具就可以看到具体的扫描风险输出:

$ /root/go/bin/shadow test_namesapce.go
/home/shihai/tests/test_go/test_namesapce.go:8:3: declaration of "x" shadows declaration at line 4

参考文档