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 } }