golang make 和 new 的区别

在 Go 中,make 和 new 都用于内存分配,但它们的用途和行为有很大不同。理解它们的区别对于正确地使用 Go 的内存管理非常重要。

make

用途: make 只用于创建 slice、map 和 channel(这三种类型是 Go 的引用类型)。

返回值: 返回的是初始化后的对象的引用(而不是指针)。例如,make([]int, 10) 返回一个 []int 类型的 slice,而不是 *[]int。

初始化: make 不仅分配内存,还初始化了相应的数据结构,以便立即使用。例如,它会分配底层数组并设置 slice 的长度和容量。

示例:

go

复制代码
mySlice := make([]int, 5)    // 创建一个长度为 5 的 slice
myMap := make(map[string]int) // 创建一个空的 map
myChan := make(chan int, 10)  // 创建一个带缓冲区的 channel

new

用途: new 用于分配任意类型的内存,并返回指向该类型的指针。它可以用于创建结构体、基本类型(如 int、float 等)以及其他复合类型的指针。

返回值: 返回的是一个指向分配内存的指针,并且该内存初始化为零值。比如,new(int) 返回的是 *int,指向值为 0 的内存。

初始化: new 只分配内存,并将该内存置为零值。它不做任何其他初始化操作。

示例:

go

复制代码
p := new(int)    // 分配一个 int 类型的指针,值为 0
fmt.Println(*p)  // 打印 0

s := new(string) // 分配一个 string 类型的指针,值为空字符串 ""
fmt.Println(*s)  // 打印空字符串

make vs new 的对比总结

用途不同:

make 专门用于初始化 slice、map 和 channel 这三种引用类型。

new 用于分配任意类型的内存,返回指向该内存的指针。

返回类型:

make 返回一个被初始化后的(非零值)类型本身的引用。

new 返回指向被分配内存的指针,类型是 *T。

初始化行为:

make 会进行内存分配并且初始化数据结构,使其可以立即使用。

new 只分配内存,并将其初始化为零值,不进行其他初始化操作。

何时使用 make 或 new

使用 make: 当你需要创建 slice、map 或 channel 时,使用 make,因为它们需要特殊的初始化步骤才能正确使用。

使用 new: 当你需要创建一个指向任意类型的新零值实例的指针时使用 new,尤其是结构体或基本类型的指针。

相关推荐
LuminousCPP18 分钟前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
web3.088899928 分钟前
1688 图搜接口(item_search_img / 拍立淘) 接入方法
开发语言·python
один but you1 小时前
从可变参数到 emplace:现代 C++ 性能优化的核心组合
java·开发语言
IT_陈寒1 小时前
Redis缓存击穿把我整不会了,原来还有这手操作
前端·人工智能·后端
kyriewen2 小时前
面试官让我查各部门工资最高的员工,我用AI三秒写出窗口函数,他愣了
后端·mysql·面试
文心快码BaiduComate2 小时前
干货|Comate Harness Engineering工程实践指南
前端·后端·程序员
光辉GuangHui2 小时前
Agent Skill 也需要测试:如何搭建 Skill 评估框架
前端·后端·llm
MY_TEUCK2 小时前
【Java 后端 | Nacos 注册中心】微服务治理原理、选型与注册发现实战
java·开发语言·微服务
我是谁的程序员2 小时前
Mac 上生成 AppStoreInfo.plist 文件,App Store 上架
后端·ios
irving同学462382 小时前
Node 后端实战:JWT 认证与生产级错误处理
前端·后端