2.3 变量

变量声明

var 变量名 类型 = 表达式,类型和表达式可省其一。省类型则自动推导,省表达式则用零值:数值 0、布尔 false、字符串 ""、引用类型和接口 nil。Go 不存在未初始化的变量。

var i, j, k int
var b, f, s = true, 2.3, "four"
var f, err = os.Open(name)

简短变量声明

函数内用 := 声明局部变量,自动推导类型。:= 是声明,= 是赋值。多变量时至少一个是新变量,否则编译报错。

freq := rand.Float64() * 3.0
in, err := os.Open(infile)
out, err := os.Create(outfile) // err 已存在,仅赋值

指针

&x 取地址,*p 读写指向的值,零值为 nil。返回局部变量地址是安全的,变量会自动逃逸到堆上。

x := 1
p := &x  // *int
*p = 2   // x == 2

new 函数

new(T) 返回零值初始化的 *T,等价于声明变量后取地址,是语法糖。new 是预定义函数,非关键字,可被重定义。

p := new(int) // *p == 0

生命周期

包级变量与程序同生命周期。局部变量不再被引用时可回收。编译器通过逃逸分析决定栈/堆分配——地址被外部引用则逃逸到堆,否则可留在栈上,与用 var 还是 new 无关。


来源:Go 语言圣经 - 2.3 变量