题目描述
package main
import (
"fmt"
)
func main() {
x := 0
fmt.Println("Before the decision block, x:", x)
if true {
x := 1
x++
}
fmt.Println("After the decision block, x:", x)
}
在上面的程序中,语句 x :=1
声明了一个新的变量,它在整个 if 语句的范围内对原来的 x 进行影射。因此,在 if 语句中声明的这个变量 x
被称为变量 shadowing 。
相关代码
如果我们想重用外部块中的实际变量 x,那么在 if 语句中,改为写入 x = 1。
package main
import (
"fmt"
)
func main() {
x := 0
fmt.Println("Before the decision block, x:", x)
if true {
// x := 1
x = 1
x++
}
fmt.Println("After the decision block, x:", x)
}
问题是:这样的 shadowing 变量有什么作用呢?如何检测这样的变量是否在代码中存在?
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
除了反直觉给你造成困扰外没有任何作用,这只是在无数语言中都存在的同名变量作用域问题,同一个变量名在不同的作用域中分别被创建,导致他们看起来是同一个其实不是同一个,你把这个看成调用函数后生成了一个同名变量就行了。
如何检测,对于1.12后的版本,要下载shadow包。然后在有代码文件的目录内执行下面第二条命令。