golang中make和new的区别

news/2025/3/26 17:00:17/

参考链接
https://worktile.com/kb/ask/38441.html

在Go语言中,make和new都是用于创建数据结构的内置函数,区别:

分配内存的区别
返回类型的区别
初始化的区别

分配内存的区别

  • make 用于创建切片、映射和通道引用类型 的数据结构。
  • new 用于创建结构体、数组和基本数据类型值类型 的数据结构。

返回类型的区别

  • make的返回类型与其参数的类型相同,而不是指向它的指针,因为这三种数据类型本身就是引用类型。(make 函数的返回值是引用类型的零值,通常是一个指向底层数据结构的指针。)
  • new返回的是指向类型的指针

简单理解就是:new返回指针,而make返回的是类型。

new的语法是:func new(Type) *Type
而make的语法为:func make(t Type, size …IntegerType) Type

初始化的区别

make和new都是golang用来分配内存的內建函数,且在 上分配内存 。但不同的是,new分配空间后,是将内存清零,并没有初始化内存;而make分配空间后,是初始化内存,而不是清零。

  • make 函数返回的是已经初始化的数据结构,例如,make([]int, 0)会创建一个空的整型切片,make(map[string]int)会创建一个空的字符串到整数的映射。
  • new 函数分配的内存空间是零值化的,即分配的内存会被初始化为零值


如果new 切片会怎么样

package mainimport ("fmt"
)func main() {slice := new([]int)fmt.Printf("切片的类型:%T\n", slice)fmt.Printf("切片的值:%v\n", slice)fmt.Printf("切片的长度:%d\n", len(*slice))fmt.Printf("切片是否为 nil:%t\n", slice == nil)
}

结果:

切片的类型:*[]int
切片的值:&[]
切片的长度:0
切片是否为 nilfalse

使用 new 关键字创建的切片 slice 的值是一个 指向空切片的指针 &[],切片的长度为 0,但它并不是 nil,因为它指向了一个真实的切片对象。

==========

对比使用make创建切片的效果

package mainimport ("fmt"
)func main() {// 使用 make 创建切片slice1 := make([]int, 5) // 创建一个包含 5 个整数的切片fmt.Println("使用 make 创建的切片:", slice1)// 使用 new 创建切片slicePtr := new([]int) // 创建一个指向切片的指针fmt.Println("使用 new 创建的切片指针:", slicePtr)
}
使用 make 创建的切片: [0 0 0 0 0]
使用 new 创建的切片指针: &[]

http://www.ppmy.cn/news/1363905.html

相关文章

java面试:Seata 分布式事务

文章目录 引言I Seata 分布式事务1.1 Seata的整体架构1.2 使用 Seata 进行分布式事务管理的步骤1.3 配置Seata Server1.4 Seata分布式模式1.5 高可用II XA模式III TA模式3.1 TA的写隔离3.2 AT模式的优缺点3.3 实现AT模式IV TCC模式 (Try-Confirm-Cancel)补偿事务4.1 空回滚和拒…

CCAA审核员职业健康安全管理体系基础考试大纲

职业健康安全管理体系基础考试大纲(第1版) 1.总则 本大纲依据CCAA《管理体系审核员注册准则》制定,适用于拟向CCAA申请注册职业健康安全管理体系审核员实习级别的人员。 2.考试要求 2.1考试科目 申请注册职业健康安全管理体系审核员实习…

HuggingFists系统功能介绍(5)--环境资源

模型库 模型库用于管理由HuggingFists系统自己生成的或者外部导入的各种模型。如:HuggingFace网站提供的各类模型可导入该模块进行统一管理及部署。该功能目前在HuggingFists的社区版中并未提供。 环境管理 环境管理-工作节点 环境管理-服务配置 环境管理主要用于与…

mac电脑创建data目录

开发的同学.在linux下.一些日志记录创建的/data/**目录…但是在mac电脑是没有data目录的…大家可以用这个方式来新建.亲测 1,在/System/Volumes/Data下创建/data目录并设置目录权限 cd /System/Volumes/Data sudo mkdir data sudo chmod -R 777 data2,…

【Android】反编译APK及重新打包

1.下载 APK 反编译工具 首先,需要下载一个 APK 反编译工具,例如 Apktool。可以在官网(https://apktool.org/docs/install)上下载最新版本的 Apktool,也可以使用包管理器来安装。 2.反编译 APK 文件 将要修改包名的 …

MCU多核异构通信原理

摘要: 本文结合瑞萨RZ/G2L 多核处理器,给大家讲述一下多核异构设计及通信的原理。 随着电子技术的不断发展,以及市场需求的日益增长,嵌入式系统不仅要求执行复杂的控制任务,还需要实时地采集和处理数据。 为了满足这…

HarmonyOS-配置卡片的配置文件

配置卡片的配置文件 卡片相关的配置文件主要包含FormExtensionAbility的配置和卡片的配置两部分: 卡片需要在module.json5配置文件中的extensionAbilities标签下,配置FormExtensionAbility相关信息。FormExtensionAbility需要填写metadata元信息标签&am…

支持国密ssl的curl编译和测试验证(下)

上接支持国密ssl的curl编译和测试验证(上) 4.4 验证国密http2协议功能 命令:/opt/gmcurl/bin/curl --http2 --tlcp "https://www.test.com:9443/" -kv输出:* Host www.test.com:9441 was resolved. * IPv6: (none) * IPv4: 127.0.0.1 * Tr…