go作用域
作用域指声明的标识符在代码中的可见范围,标识符包括变量、结构体、方法、常量等。在 go 里,作用域通过代码块实现。
- 预定义标识符全局可见
预定义标识符包含基础数据类型、空指针、常用函数等。
Types:
any bool byte comparable
complex64 complex128 error float32 float64
int int8 int16 int32 int64 rune string
uint uint8 uint16 uint32 uint64 uintptr
Constants:
true false iota
Zero value:
nil
Functions:
append cap close complex copy delete imag len
make new panic print println real recover
在顶层声明的常量、类型、变量、函数(非方法)属于包代码块。
被导入的包名属于文件代码块,在导入它的文件里可见。
方法接收器、函数参数等属于函数体代码块。
函数内部的常量或者变量的作用域开始于声明结束,结束于最近的代码块。下面代码无法通过编译,提示找不到
f
。
f := func() {
f()
}
修改成下面的形式(先声明),可以通过编译。
var f func()
f = func() {
f()
}
如果在函数外部声明f
,会提示循环引用。
- 函数内部类型标识符的作用域开始于标识符,结束于最近的代码块。例如树节点定义,可以在定义里引用自己。
type Node struct {
Left, Right *Node
}
- 标识符重复定义
同一个标识符不能在同一个代码块重复定义,但是可以在内部代码块定义。例如:
package main
import (
"fmt"
)
func main() {
v := "outer"
fmt.Printf("\nv outer :%s", v)
{
v := "inner"
fmt.Printf("\nv inner :%s", v)
}
fmt.Printf("\nv outer :%s", v)
}