Go语言基础八——new和make的使用和区别

226 阅读2分钟

我正在参加「掘金·启航计划」

1、new和make

newmakeGo 语言中用于内存分配的原语。简单来说,new 只分配内存,make 用于初始化slicemapchannel

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,只用于slicemap以及chan的内存创建,返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。

func make(t Type, size ...IntegerType) Type

make函数是无可替代的,我们在使用slicemap以及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只用于slicemap以及channel的初始化,返回的还是这三个引用类型本身。
  • new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。

1.4、其实new不常用

所以有new这个内置函数,可以给我们分配一块内存让我们使用,但是现实的编码中,它是不常用的。我们通常都是采用短语句声明以及结构体的字面量达到我们的目的,比如:

1
2
i:=0
u:=user{}

这样更简洁方便,而且不会涉及到指针这种比麻烦的操作。

make函数是无可替代的,我们在使用slicemap以及channel的时候,还是要使用make进行初始化,然后才才可以对他们进行操作。