var
var声明创建一个具体的变量,当省略表达式时,其默认值:
- 对于数字是0
- 对于bool是false
- 对于string是“”
- 对于接口和引用类型(slice、指针、map、通道、函数)是nil
- 对于一个array或struct这样的复合类型,零值是起所有元素或成员的零值 使用var声明变量的类型,如果是引用类型,是没有分配真实地址的,直接使用会引发空指针panic。
make 和 new
make多会用在引用类型,它会分配并初始化一个对象,返回Type本身,而非指向它的指针,包含类型:slice、map或channel等
new会创建一个Type类型的变量,初始化为Type的0值,返回变量地址,返回*Type
new 和 var
new会创建一种指定类型的变量,variable := new(Type) 会创建一个Type类型的变量,并返回其地址*Type ,以下两段代码有同样的行为:
func newInt() *int {
return new(int)
}
func newInt() *int {
var dummy int
return &dummy
}
值类型和引用类型
值类型
变量直接存储值,内存通常在栈中分配。
基本数据类型int、float、bool、string以及数组和struct都是值类型。
引用类型
变量存储的是一个地址,这个地址存储最终的值。内存通常在堆上分配。
当没有任何变量引用这个地址时,该地址对应的数据空间就由GC来回收。
指针、slice、map、chan、interface等都是引用类型。