var,make,new的区别

338 阅读1分钟

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等都是引用类型。