背景介绍
:=
是一个简短变量声明,通过此符号我们可以定义一个变量并进行赋值。Golang语言的一个指导设计原则就是让语法更整洁。比如:我们在if
、for
等语句中定义本地变量。但使用此申明有一个风险,那就是作用域范围。如果使用不当可能会导致变量屏蔽(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
参考文档
- 《Golang新手可能会踩的50个坑》
- 《Why there are two ways of declaring variables in Go, what's the difference and which to use?》