package main
import "fmt"
// 全局作用域声明的函数
var f = func(i int) {
fmt.Println("x")
}
// 全局作用域声明的整型
var m = 2
func main() {
// 注意 1 : 不同作用域下,同名变量并不会导致编译失败,只是不推荐如此做,可能会得到意料之外的结果,增加程序复杂度
// main 作用域内声明的函数--并初始化
f := func(i int) {
fmt.Println(i)
if i > 0 {
// 此处调用的是全局作用域的f()函数
f(i - 1) // 初始化时用到了 f()函数,但此时本作用域内甚至main 作用域内都还没有f()函数,所以向上查找,找到了全局作用域的f()函数并调用
}
}
f(10) // 此处调用时,main作用域已有f(),所以调用的是main里面生命的f()函数
m := 12 + m // 同理,初始化时的 m 其实是全局作用域的 m
fmt.Println(m) // 此时的 m 已经声明完毕
// 注意 2 :此时再声明一个同名变量报错:同一作用域下不可同名
// m:= 12 这里报错
// 这里扩展了一个独立作用域
{
m := m * 2 // 所以这里声明变量 m 是没问题的,因为本所用域内并不存在同名变量 且初始化时使用的 m 依然是上一级所用域的 m
fmt.Println(m) // 输出结果 14 * 2
}
}
看完代码看总结0.0
- 同一作用域下不可存在相同变量名
- 不同作用域,可以存在相同变量名称,变量调用时注意分析变量(可能引用的是上一级作用域的变量)
- 作用域可扩展