变量的查找过程:
- 首先,代码引用变量的时候总会有限查找当前代码块中的那个变量。注意,这里的“当前代码块”仅仅是引用变量的代码所在的那个代码块,并不包含任何子代码块。
- 其次,如果当前代码块中没有声明以此为名的变量,那么程序会沿着代码块的嵌套关系,从直接包含当前代码块的那个代码块开始,一层一层地查找。
- 一般情况下,程序会一直查找到当前代码包代表的代码块。如果仍然找不到,那么GO语言的编译器就会报错了。
例如:
package main
import "fmt"
var block = "package"
func main() {
block := "function"
{
block := 11111
fmt.Printf("The block is %v.\n", block)
func1()
}
fmt.Printf("The block is %s.\n", block)
//func1()
}
func func1(){
fmt.Printf("The block is %s.\n", block)
}
输出结果:
The block is 11111.
The block is package.
The block is function.
可重名变量和变量重命名的区别:
- 变量重声明中的变量一定是在同一代码块内的。这里的“某一代码块内”并不包含它的任何子代码块,否则就变成了“多个代码块之间”。而可重命名变量指的正是在多个代码块之间由相同的标识符代码的变量。
- 变量重声明是对同一变量的多次声明,这里的变量只有一个。而可重名白能量中涉及的变量肯定是有多个的。
- 无论对变量重声明多少次,其类型必须始终一致,具体遵从它第一次被声明时给定的类型。而可重名比那辆之间不存在类似的限制,他们的类型是任意的 。