go:new和make的区别

56 阅读3分钟

参考网址

juejin.cn/post/708591…

总结

图片.png

new()和make(),二者都是golang的内置函数。
作用:二者的作用都是“分配内存”

区别:
   new()适用于一切类型,make()只适用于slice map chan这3种类型。
   new()返回的是指向该类型内存地址的指针。
   make()返回的是类型本身。
   
   new()只负责申请内存,不会初始化数据
   make()申请内存,然后初始化数据。

变量声明的方式

var test1 int
我们可以通过var 变量名称 类型 来声明一个变量。
当我们没有赋值的时候,变量是有初始值的。但是不同的类型的初始值是不同的。
比如说 string 的零值是空字符串"", int 的零值是0,引用类型的零值是nilbool的初始值是false

什么是new

图片.png

new()是golang的内置函数。
是分配内存的内置函数,第一个参数是类型,而不是具体的值,返回值是该类型的指针。

对于引用类型的变量,不仅要声明,并且还要给它分配内存
package main

import "fmt"

func main() {
  var test *string  // 声明一个变量,是指针类型
  fmt.Println(test)
  
  test = new(string)  // 通过new()给该变量分配内存
  *test = "测试"
  fmt.Println(*test)
}
new()的作用是根据传入的类型分配一片内存空间,并且返回指向这片内存空间的指针。
此时变异器知道你需要多少内存,用于结构体和内存。其实只要是任何指针都可以new(),它只负责申请内存,不会初始化数据。
我们平时的用法是new()一个机构体,返回一个对象的引用。这个指针指向的内容的值为零,记住不是指针为零。
当我们声明一个指针类型时,一定是new一个,就是为了给这个指针分配内存,不然会报内存地址为空。

什么是make

make()也是内存分配的内置函数,但是和new()不同。

图片.png

大意是make内置函数分配并初始化一个slice、mapchan类型的对象。像new函数一样,第一个参数是类型,而不是值。

与new不同,make的返回类型与其参数的类型相同,而不是指向它的指针。结果取决于传入的类型。

并且slice在make的时候,第二个参数必须传递,也就是切片的长度。否则会编译失败。

make()的作用是初始化内置的数据结构,也就是slice,map,channel。
此时编译器不知道你需要使用多少内存,因为这些数据结构具体占用多少内存是运行时才能知道的。
slice map channel 这些数据类型是复合类型的数据结构,通常是一个结构体+堆内存,因此make()的额外作用就是初始化这些数据和指针,从这一点上来看,make的作用就是申请内存,并且初始化数据。
    slice := make([]int, 0)
    mp := make(map[string]string, 100)
    ch := make(chan int, 5)

总结

new()是一个内置函数,它会分配一段内存,并返回指向该内存的指针。同时,new()函数会把分配的内存置为零,也就是类型的零值。
new 函数,它返回的永远是类型的指针,指针指向分配类型的内存地址。需要注意的是,new 函数只会分配内存空间,但并不会初始化该内存空间。

make()也是分配内存的内置函数,和new不同的是,make()只适用于slice,mapchan这些类型的内存构建,而且返回的类型就是这3个类型本身,而不是指针。

通过以上分析,总结一下 newmake 主要区别如下:
1. make 只能用来分配及初始化类型为 slice、mapchan 的数据。new 可以分配任意类型的数据;
1. new 分配返回的是指针,即类型 `*Type`make 返回类型本身,即 `Type`1. new 分配的空间被清零。make 分配空间后,会进行初始化;