8月更文挑战|make和new的区别

384 阅读2分钟

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战

知识点

golang中的变量类型

按照定义来说可以分类:

基本数据类型

整数类型(int、int16)、浮点类型(float32、float64)、字符型(byte)、布尔型(bool)、字符串(string)、rune(int32)

派生数据类型

指针(Pointer)、数组、结构体(struct)、管道(Channel)、函数(func)、切片(slice)、接口(interface)、map

其次在使用时候也可以这样划分:

  • 引用类型:引用类型的变量,我们不光要声明它,还要为它分配内容空间
  • 值类型:变量的默认值是他们的零值

值类型与引用类型在当作参数进行传递时,值类型参数在函数方法中改变是不会改变上层方法的变量值的,而引用类型的参数是会变化的上层方法中变量的值的

new和make的区别

  • new 只分配内存,只接收参数是一个“类型”的指向该类型点内存地址指针
  • make 只能用于 slice、map 和 channel 的初始化,返回的类型就是这三个类型本身(引用类型)

new

func new(Type) *Type

例如:

var num *int    //定义
num = new(num)  //分配空间
*num = 99       //赋值
fmt.Println(*num)

type student struct{
    Name string
    Age uint
}

var xiaohong *student        //定义
xiaohong = new(student)      //分配空间
xiaohong.Name = "xiaohong"   //赋值
xiaohong.Age = 18            //赋值

fmt.Println(xiaohong)

它返回的永远是类型的指针,指针指向分配类型的内存地址。

new在实际中不常用,反正小白的我确实如此,make倒是常用。

make

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

例如:

data := make(map[string]interface{}, 0)

Go语言中的 new 和 make 主要区别如下:

  • make 只能用来分配及初始化类型为 slice、map、chan 的数据。new 可以分配任意类型的数据;
  • new 分配返回的是指针,即类型 *Type。make 返回引用,即 Type;
  • new 分配的空间被清零。make 分配空间后,会进行初始化;

何时使用

  • 切片、映射和通道,使用make
  • 数组、结构体和所有的值类型,使用new

参考

make和new关键字的区别及实现原理

深入讲解Go语言中函数new与make的使用和区别