TypechoJoeTheme

至尊技术网

登录
用户名
密码

Golang的new和make有什么区别对比内存分配方式的异同点

2025-12-22
/
0 评论
/
3 阅读
/
正在检测是否收录...
12/22

标题:深入解析Golang中new与make的区别及内存分配机制
关键词:Golang、new、make、内存分配、切片、映射、指针
描述:本文详细对比Golang中new和make的异同点,分析两者在内存分配方式上的底层逻辑,帮助开发者正确选择初始化方式。

正文:

在Golang中,newmake都是用于内存分配的内置函数,但它们的应用场景和底层机制截然不同。许多初学者容易混淆两者的用法,导致程序出现意料之外的错误。本文将深入探讨它们的区别,并揭示内存分配背后的设计哲学。

核心功能对比

new的功能
new的作用是分配零值内存并返回指针。它接受一个类型作为参数,返回该类型的指针。例如:

p := new(int)  // 分配int类型的零值,返回*int

此时*p的值为0,因为new不会初始化内存,仅完成分配。

make的功能
make专门用于初始化切片(slice)、映射(map)和通道(channel)这三种引用类型。它返回的是已初始化的(非零值)对象,而非指针:

s := make([]int, 5)  // 创建长度为5的切片,元素初始化为0  
m := make(map[string]int)  // 初始化一个空map

内存分配机制差异

  1. 底层调用方式



    • new直接调用底层的内存分配函数(如mallocgc),仅分配一块清零的内存区域。
    • make会触发类型特定的初始化逻辑。例如,对于切片,它会分配底层数组并设置长度和容量;对于map,会初始化哈希桶等数据结构。
  2. 返回值的本质



    • new返回指针,适用于所有类型(包括结构体、基本类型等)。
    • make返回对象本身,仅限slice、map、channel三种类型。
  3. 零值处理



    • new的返回值永远是类型的零值指针。
    • make会生成一个立即可用的对象。例如,make(map[string]int)返回的map可直接执行插入操作,而new(map[string]int)返回的指针指向nil,直接使用会导致panic。

典型场景分析

错误示例:误用new初始化map

var m *map[string]int = new(map[string]int)  
(*m)["key"] = 1  // 运行时panic:nil map

此处new仅分配了指针,map底层结构未初始化,必须改用make

正确使用new的场景
当需要显式获取结构体指针时,new比短声明更清晰:

type User struct { Name string }  
u := new(User)  // 等价于 &User{},但意图更明确

性能考量

  • make在初始化复杂类型(如map)时会有额外开销,因为它需要构建哈希表等数据结构。
  • new的性能开销极低,仅相当于一次内存分配。

底层设计思想

Golang通过newmake的分离,实现了以下设计目标:
1. 显式区分值类型和引用类型:基本类型和结构体通过new处理,而slice/map/channel这些需要内部结构的类型由make管理。
2. 避免隐式成本:如果new能初始化所有类型,可能导致开发者无意中触发高开销的初始化操作。

总结选择策略

  • 需要值类型指针结构体指针 → 使用new
  • 需要切片、映射、通道 → 使用make
  • 其他初始化需求 → 考虑字面量(如&User{})或工厂函数

理解这两者的区别,能帮助开发者写出更高效、安全的Golang代码。

朗读
赞(0)
版权属于:

至尊技术网

本文链接:

https://www.zzwws.cn/archives/42188/(转载时请注明本文出处及文章链接)

评论 (0)