我正在参加「掘金·启航计划」
1、new和make
new 和 make 是 Go 语言中用于内存分配的原语。简单来说,new 只分配内存,make 用于初始化slice 、map 和 channel。
1.1、new
new是一个内置的函数,他的签名如下:
func new(Type) *Type
//Type表示类型,new函数只接收一个参数,这个参数是一个类型
//*Type表示类型指针,new函数返回一个指向该类型内存地址的指针,并且该指针对应的值为该类型的零值。
var a *int 只是声明了一个指针变量a但是没有初始化,指针作为引用类型需要初始化才会有内存空间,才可以给他赋值。
func main(){
var a *int
fmt.Println(a) //nil
//*a = 10 //invalid memory address or nil pointer dereference
a = new(int) //需要new初始化才能赋值
*a = 10
fmt.Println(*a) //10
b := new(int)
*b = 10
fmt.Println(*b)
}
1.2、make
make也是用于内存分配的,区别于new,只用于slice,map以及chan的内存创建,返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。
func make(t Type, size ...IntegerType) Type
make函数是无可替代的,我们在使用slice,map以及channel的时候,都需要使用make进行初始化,然后才可以进行操作。
func main(){
var b map[string]string //只是声明变量b是一个map类型
b = make(map[string]string, 10, 20) //初始化
b["ceshi"] = "test"
}
1.3、new和make的区别
- 二者都是用来做内存分配的。
make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身。new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。
1.4、其实new不常用
所以有new这个内置函数,可以给我们分配一块内存让我们使用,但是现实的编码中,它是不常用的。我们通常都是采用短语句声明以及结构体的字面量达到我们的目的,比如:
1
2
i:=0
u:=user{}
这样更简洁方便,而且不会涉及到指针这种比麻烦的操作。
make函数是无可替代的,我们在使用slice、map以及channel的时候,还是要使用make进行初始化,然后才才可以对他们进行操作。