当前位置: 云端笔记 » 编程 » Golang » 【Golang】new与make区别

【Golang】new与make区别

Go语言中new和make都是用来内存分配的原语(allocation primitives)。简单的说,new只分配内存,make用于slice,map,和channel的初始化。

主要区别于:

  • new 给你一个指针,指向零值,适用于 int 型、数组、结构体等值类型。func new(Type) *Type
  • make只能用于 slice、map、channel 三种内建引用类型。返回类型本身(非指针)。func make(t Type, size …IntegerType) Type

一、new

1.基本类型(值类型)

一个指针变量声明后为nil,且不可赋值,如下示例:

最终程序返回nil值,nil的值是不能直接赋值的,如果给test赋值,程序报错

程序报错:

如何解决?通过Go提供了new来初始化一地址就可以解决。可以理解为指针变量声明后未分配内存空间,未指向内存地址即nil,进行赋值自然就报错。通过new分配至地址后指针变量指向内存地址,并且初始化zero值

程序返回:

通过new函数,返回一个指向新分配的类型为int的指针,指针值为0x1400000e0d8,这个指针指向的内容的值为零(zero value)。

数组类型其实跟基本类型一样,也是值类型,通过new创建与基本类型一样,只不过变成数组指针,并且指向数组首元素地址:

输出结果:

go会给引用类型初始化为nil,nil是不能直接赋值的。并且不能用new分配内存,示例:

输出报错,new对map并未起到初始化内存作用

那么用make函数处理会是怎么样呢?示例:

输出

  • new(T)
    • 为类型 T 分配一块 零值内存,返回 *T(指针)。
    • 常用于基本类型或结构体。
    • 只是简单的内存分配,没有初始化内部数据结构。
  • make(T, args)
    • 只能用于 slice、map、chan 这三种引用类型。
    • 除了分配内存,还会 初始化内部数据结构,并返回 T 本身(不是指针)。
    • 为什么?因为这三种类型的底层结构比较复杂,需要额外的元数据管理。

未经允许不得转载:云端笔记 » 【Golang】new与make区别

相关文章

暂无内容~

评论 (0)

5 + 6 =

contact