1. 变量声明与内存分配

var {变量名称} {变量类型}
var num int
var s string
var p *int

当我们采用上述方式声明变量,即使我们没有显式地给变量赋值,但是此时它们的结果是各自变量类型的零值。 int 类型零值为 0,string 零值为 “”,引用类型的零值是 nil。

引用类型: 变量存储的是一个地址,这个地址用来保存真正的值。内存通常在堆上分配,通过 GC 回收。常见的引用类型包括: map、slice、管道、channel、指针、函数、接口 interface 等等
值类型:基本数据类型,如 int、float、doubke、string 以及数组等等,特点是变量直接存储值。内存通常在栈上分配、调用函数后被释放

对于值类型的变量,我们不需要显示分配内存空间。与基本类型不同,对于引用类型的变量,我们不仅要声明、还要给它分配内存,否则会出现运行时 panic

func main() {
    var num int
    var s string
    var p *int
​
    println(num)
    println(s)
    println(p)
​
    *p = 1 // 引发 runtime panic
}

2. 同样是内存分配,new 和 make 有什么区别?

针对以上问题,正确的做法是在声明引用类型变量后,显示为其分配内存

func main() {
    var p *int
​    p = new(int)

    *p = 1 
}


new()make()
new()make()new()make()make()

以下是两者的定义,读者可以明显看出我们上面列出的前两点区别

func make(t Type, size ...IntegerType) Type
​
func new(Type) *Type

参考: