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
参考: