企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
new和make是内建的两个函数,主要用来创建分配类型内存。 #### 1、new函数是内建函数,函数定义为 ``` func new(Type) *Type ``` new 的作用是初始化一个指向类型的指针(*Type ),使用new函数来分配空间。传递给new 函数的是一个类型,不是一个值。返回值是 指向这个新分配的零值的指针。 #### 实例 ~~~ package main import ( "fmt" ) func main() { a := new([]int) fmt.Println(a) //输出&[],a本身是一个地址 } ~~~ 运行结果: &[] #### 实例2 ~~~ package main import "fmt" func main() { var i *int fmt.Println("没有new之前I得值为:", i) i = new(int) fmt.Println("new之后I得值为:", i) } ~~~ 执行结果: ``` 没有new之前I得值为: <nil> new之后I得值为: 0xc0000aa058 ``` #### 2、make函数是内建函数,函数定义为 #### 定义 `make`也是用于内存分配的,make(T, args)函数的目的与new(T)不同,make只用于`chan`、`map`以及slice(切片)的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。 ``` func make(t Type, size ...IntegerType) Type ``` 第一个参数是一个类型,第二个参数是长度。 make返回类型是 T(不是T*)的一个初始化的(不是零值)的实例。 make实例: ~~~ var slice1 []type = make([]type, len) 也可以简写为 slice1 := make([]type, len) ~~~ 实例: ~~~ package main import ( "fmt" ) func main() { b := make([]int, 1) fmt.Println(b) //输出[0],b本身是一个slice对象,其内容默认为0 } ~~~ 运行结果: [0] #### 注意: a、简单来说,new只是分配内存,不初始化内存; 而make即分配又初始化内存。所谓的初始化就是给类型赋初值,比如字符为空,整型为0, 逻辑值为false等。 b、当对slice,map以及channel进行初始化时,使用make比new方式要好,而其他形式的则利用new进行初始化 c、new 的作用是初始化一个指向类型的指针(*T),make 的作用是为 slice,map 或 chan 初始化并返回引用(T)。 d、二者都是内存的分配(堆上),但是`make`只用于slice、map以及channel的初始化(非零值);而`new`用于类型的内存分配,并且内存置为零。 e、`make`返回的还是这三个引用类型本身;而`new`返回的是指向类型的指针。