Go语言中new()和 make()的区别详解

Go语言new与make核心区别详解 一、new在Go语言中,new和make都是用于内存分配的内建函数,但二者在用途和实现机制上存在本质区别。一、new。 阅读详情

概述

Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。

new 的主要特性

首先 new 是内建函数,你可以从 http://golang.org/pkg/builtin/#new 这儿看到它,它的定义也很简单:

func new(Type) *Type

官方文档对于它的描述是:

内建函数 new 用来分配内存,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配类型零值的指针

根据这段描述,我们可以自己实现一个类似 new 的功能:

代码如下:

func newInt() *int {
  var i int
  return &i
}



someInt := newInt()

我们这个函数的功能跟 someInt := new(int) 一模一样。所以在我们自己定义 new 开头的函数时,出于约定也应该返回类型的指针。

make 的主要特性

make 也是内建函数,你可以从 http://golang.org/pkg/builtin/#make 这儿看到它,它的定义比 new 多了一个参数,返回值也不同:

代码如下:

func make(Type, size IntegerType) Type

官方文档对于它的描述是:

内建函数 make 用来为 slice,map 或 chan 类型分配内存和初始化一个对象(注意:只能用在这三种类型上),跟 new 类似,第一个参数也是一个类型而不是一个值,跟 new 不同的是,make 返回类型的引用而不是指针,而返回值也依赖于具体传入的类型,具体说明如下:

Slice: 第二个参数 size 指定了它的长度,它的容量和长度相同。
你可以传入第三个参数来指定不同的容量值,但必须不能比长度值小。
比如 make([]int, 0, 10)


Map: 根据 size 大小来初始化分配内存,不过分配后的 map 长度为 0,如果 size 被忽略了,那么会在初始化分配内存时分配一个小尺寸的内存

Channel: 管道缓冲区依据缓冲区容量被初始化。如果容量为 0 或者忽略容量,管道是没有缓冲区的

总结

new 的作用是初始化一个指向类型的指针(*T),make 的作用是为 slice,map 或 chan 初始化并返回引用(T)。

转自:https://blog.youkuaiyun.com/cut001/article/details/80506710

Go基础:Go语言中内存分配用 new 还是 make?什么情况下该用谁? Go语言中new和make的区别与使用场景:new用于分配内存并返回指针,适用于所有类型,初始化零值;make专门用于创建和初始化slice、map和channel,返回类型本身并初始化内部数据结构。核心区别在于new返回指针,make返回类型;new适用于所有类型,make仅限引用类型。常见错误包括对引用类型使用new或对非引用类型使用make。最佳实践是结构体优先使用字面量语法,引用类型必须使用make。理解两者的差异对编写高效正确的Go代码至关重要。 阅读详情

相关推荐

Unity AR开发实战:从Vuforia图片识别到实体识别全流程解析

增强现实(AR)技术通过计算机视觉算法将虚拟信息叠加到现实世界,其核心原理在于对现实环境的感知与理解。在移动端AR开发中,图像识别与物体识别是实现虚实融合的关键技术,它们决定了虚拟内容能否准确、稳定地与现实对象对齐。Vuforia作为成熟的商业AR SDK,为开发者提供了从平面图像识别(Image Target)到三维实体识别(Model Target)的完整解决方案,极大降低了计算机视觉技术的应用门槛。在工程实践中,Vuforia通过封装复杂的特征提取与匹配算法,使开发者能够专注于交互设计与内容制作,广泛

weixin_30972263的博客 302

go 中 new 和 make 的区别

new 和 make 是 Go 语言中用于内存分配的原语。简单来说,new 只分配内存,make 用于初始化 slice、map 和 channel。 new new(T) 函数是一个分配内存的内置函数,为每个类型分配一片内存,并初始化为零值且返回其内存地址。 语法是 func new(Type) *Type 众所周知,一个已经存在的变量可以赋值给它的指针。 var p int var v *int v = &p *v = 11 fmt.Println(*v) 那么如果它还不是一个变量呢?你可以直

码的世界 8416

Chapter 7 Linear Voltage Regulators

这一章我们介绍LDO.

2304_76736886的博客 2764

Go语言中的new和make的区别

Go语言中new和make都是用来内存分配的原语(allocation primitives)。简单的说,new只分配内存,不初始化内存;make用于slice,map,和channel的初始化make和new都是golang用来分配内存的內建函数,且在堆上分配内存,make 即分配内存,也初始化内存。new只是将内存清零,并没有初始化内存。make返回的还是引用类型本身;而new返回的是指向类型的指针。make只能用来分配及初始化类型为slice,map,channel的数据;

m0_72874409的博客 893

远程桌面连接失败?手把手教你解决CredSSP加密Oracle漏洞(Win10/Win11通用)

本文详细解析了Windows远程桌面连接因CredSSP加密Oracle漏洞安全更新导致的“身份验证错误”问题。文章从原理入手,提供了通过组策略编辑器(适用于专业版)和注册表编辑器(适用于家庭版)两种核心解决方案,指导用户将安全策略调整为推荐的“缓解”模式,以在保障安全的前提下恢复连接,并给出了高级脚本处理与安全最佳实践。

u6v7w8x的博客 724

泰山派rk3566 audio音频基础介绍

本文介绍了嵌入式系统中音频处理的基础知识,重点围绕RK3566平台的音频子系统展开。文章首先解释了音频信号从模拟到数字的转换过程,包括采样率、位深和声道等核心概念。随后详细分析了嵌入式音频开发中的关键接口:I2C用于控制音频编解码器,I2S作为专用音频数据传输总线,以及PCM作为原始音频格式和ALSA设备抽象的双重含义。通过对这些基础概念和接口的解析,为在RK3566平台上进行音频驱动开发和应用调试提供了理论基础。

qq_37077309的博客 294

深入解析 Go 语言中的 new 和 make:彻底搞懂内存分配与初始化的区别!

Go 语言中的new和make是两种用于内存分配的内置函数,但它们的使用场景和返回结果完全不同。new用于分配任意类型的内存,返回类型的指针;而make则专门用于引用类型的初始化,返回类型本身。通过本文的详细讲解,相信你已经掌握了new和make的区别和使用场景。在开发中,理解这些基础概念对编写高效、健壮的 Go 代码至关重要。

Linke的博客 1729

3D 结构光相机工作原理全解 | 从编码投射到三维重建,原理 + 代码 + 工业实战一站式掌握

本文从3D结构光相机的整体架构出发,层层拆解了编码投射、相位计算、相位解包裹、三维重建的核心原理,补充了工业实战所需的公式推导、代码实现、参数调优、设备选型和案例落地,核心总结如下:相位是3D结构光成像的“灵魂”,其精度、稳定性直接决定3D重建的效果,包裹相位与绝对相位的区分的是工业实战的基础;编码投射的核心是“正弦条纹+格雷码条纹”组合,正弦条纹负责高精度相位提取,格雷码条纹辅助解包裹,适配工业场景的精度与稳定性需求;

getusushu的博客 414

Go(Golang)make vs new

函数用途返回值适用类型是否初始化使用场景new(T)分配内存返回*T指针所有类型✅ 置零初始化(Zero Value)原始类型或结构体分配make(T)创建并初始化内置类型返回T(非指针)仅限✅ 初始化完成可直接使用通常用于切片、字典、通道│ 分配零值内存 │ │ 初始化 slice/map/chan ││ 返回 *T 指针 │ │ 返回 T 本身 │。

gopher123的博客 854

一文让你轻松理解802.11ax RU的概念

RU

1042484520@qq.com(邮箱) 3367

Jetson Nano 实战指南:深度学习环境配置与 YOLOv5 边缘端部署解析

Jetson Nano是NVIDIA推出的嵌入式AI开发板,凭借其强大的GPU计算能力和完善的软件生态系统,成为边缘AI部署的理想平台。本教程源于作者团队参加2024中国机器人大赛暨RoboCup机器人世界杯中国赛机器人先进视觉3D识别赛道的实战经验,是一份经过验证的环境部署指南。

FJN110的博客 152

Golang 语言中new()和 make()的区别详解

参考:https://www.jb51.net/article/56837.htm 概述 Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。 new 的主要特性 首先 new 是内建函数,你可以从http://golang.org/pkg/builtin/#new这儿看到它,它的定义也很简单: 复制代码代码如下: func new(Type) *Type 官方文档对于它的描述是: 复制代码代码如下: 内建函数..

Mark66890620 259

从 RAP OData 到可交付的 SAP Fiori 应用:部署与授权全链路实战笔记

摘要:本文探讨了RAP开发中常见的交付误区,指出开发者预览(FEAP)并非可部署应用,强调从服务发布到业务应用落地的完整链路。文章详细对比了不同部署路径(ABAP/BTP),解析权限管理关键点(SAP_BR_DEVELOPER的临时性),并提供了标准授权组合方案(IAM+业务目录+角色)。通过"发运跟踪"案例,展示了从开发验证到生产部署的全流程,特别提醒注意开发环境与生产环境的权限差异,避免"开发机正常、生产机403"的典型问题。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1401

Go 语言中的 new() 和 make()

博客主页:🏆看看是李XX还是李歘歘🏆 🌺每天分享一些包括但不限于计算机基础、算法等相关的知识点🌺 💗点关注不迷路,总有一些📖知识点📖是你想要的💗 ⛽️今天的内容是 Go 语言中的 new() 和 make()⛽️💻💻💻 make和new是GO里面的两个内置函数,用来创建并分配元素的内存。区别是什么? new为任意类型【包括:chan、map 以及 slice】分配一片内存空间(allocates memory),并返回指向这片内存的指针。下面的代码可以看出,new只接受...

分享包括但不限于计算机基础知识、数据结构与算法、Golang技术栈。年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及! 1168

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

go语言make()和new()的区别

new() func new(Type) *Type 内建函数new分配内存。其第一个实参为类型,而非值。其返回值为指向该类型的新分配的零值的指针。 make() func make(Type, size IntegerType) Type 内建函数make分配并初始化一个类型为切片、映射、或通道的对象。其第一个实参为类型,而非值。make的返回类型与其参数相同,而非指向它的指针。其具体结果取决于具体的类型: slice:size指定了其长度。该切片的容量等于其长度。切片支持第二个整数实参可用来指定不同

weixin_45514135的博客 139

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Go语言中new()和make()的区别

1. Go语言中的值类型和引用类型 值类型:int,float,bool,string,struct和数组 (数组要特别注意,别搞混了) 变量直接存储值,分配栈区的内存空间,这些变量所占据的空间在函数被调用完后会自动释放。 引用类型:slice,map,chan和值类型对应的指针 变量存储的是一个地址(或者理解为指针),指针指向内存中真正存储数据的首地址。内存通常在堆上分配,通过GC回收。 2. new() vs make() 对值类型和引用类型了解之后,再来理解new()和make()就不难了

菜鸡的博客 473

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

php视频聊天室源码_PHP实现简单聊天室(附源码)_php技巧

本篇文章是对PHP实现聊天室的源代码进行了详细的分析介绍,需要的朋友参考下一,聊天室模块实现1,聊天室主页面窗口设置代码如下:2,文件操作函数本聊天室模块使用文本来保存用户列表和发言信息,主要考虑对文件的操作在速度上要优于对数据库的操作。(1)fopen()函数,打开文件或者URL,如果打开失败,函数返回FALSE语法:fopen(filename,mode,include_path,contex...

weixin_34621896的博客 2720

Golang中make与new有何区别

本文主要给大家介绍了Go语言中函数new与make的使用和区别,关于Go语言中new和make是内建的两个函数,主要用来创建分配类型内存。在我们定义生成变量的时候,可能会觉得有点迷惑,不知道什么时候该使用make,什么时候该使用new,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用。

个人博客,记录了本人学习的各种有趣的技术。 3887

Golang make和new的区别详解

Golang make和new的区别详解

Muti-Agent 9631

深入理解 Golang 中 New() 和 make() 的区别

new()new(T)用于分配内存并返回指向类型T零值的指针。它适用于所有可以被分配的类型。用于创建切片、映射和通道,并返回初始化后的实例。它不适用于所有类型,只适用于它支持的三种引用类型。new() 用于创建任意类型的变量,而 make() 专门用于创建引用类型的变量。new() 返回指向指定类型的零值的指针,而 make() 返回指定引用类型的初始化值。使用 new() 创建的变量设置为它们的零值,而使用 make() 创建的变量根据其类型进行初始化。

qq_53742640的博客 2003

Go 语言中的 new() 和 make()的区别

本文是看了文章之后的心得。 在此感谢。概述Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。

xiaorenwuzyh的专栏 8324

go中new和make的区别分析

Go语言中new和make是内建的两个函数,主要用来创建分配类型内存。在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用。 变量的声明 var i int var s string 变量的声明我们可以通过var关键字,然后就可以在程序中使用。当我们不指定变量的默认值时,这些变量的默认值是他们的零值,比如int类型的零值是0,string...

AggressionStorm的博客 22万+

golang中make与new有什么区别?

在Go语言中,make是一个用于创建切片、映射(map)和通道(channel)等引用类型的内置函数。make的主要作用是为这些引用类型分配内存并进行初始化。在Go语言中,new是一个用于为值类型分配内存并返回指向新分配的零值实例的指针的内置函数。new主要用于创建值类型的实例,例如结构体。以下是new使用make主要用于初始化引用类型,确保它们可以被直接使用。使用new主要用于为值类型分配内存,返回一个指向新分配的零值实例的指针。选择使用make还是new取决于您要创建的数据结构的类型和初始化需求。

dennis的博客 2064
上一篇: go语言的new和make
下一篇: 【leetcode--golang】2.两数相加
cbmljs
博客等级 码龄10年 329粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值