Go语言中new与make的深度解析
在 Go 语言中,new
和 make
是两个用于内存分配的内置函数,但它们的作用和使用场景有显著区别。
理解它们的核心在于:
new(T)
: 为类型T
分配内存,并将其初始化为零值,然后返回一个指向该内存的指针 (*T
)。make(T, args...)
: 仅用于 slice、map 和 channel 这三种引用类型的创建和初始化。它返回的是类型T
本身(而不是指针*T
),并且这个T
已经被正确初始化,可以直接使用。
下面详细解释:
new
-
作用:
- 分配内存。
- 将分配的内存清零(设置为相应类型的零值)。
- 返回一个指向新分配的零值
T
的指针 (*T
)。
-
语法:
p := new(T)
其中
T
可以是任何类型。 -
返回值:
- 一个指向类型
T
的指针 (*T
)。
- 一个指向类型
-
适用类型:
- 几乎所有类型,包括基本类型(int, string, bool等)、结构体(struct)、数组(array)等。
- 也可以用于 slice, map, channel,但通常不这么用,因为
new
返回的是指向这些引用类型本身的指针,而引用类型本身在未初始化时是nil
。
-
示例:
// 为 int 分配内存,i 是 *int 类型,*i 的值是 0 var i *int = new(int) fmt.Printf("i: %p, *i: %d\n", i, *i) // *i 是 0// 为自定义结构体 MyStruct 分配内存,s 是 *MyStruct 类型 type MyStruct struct {Field1 intField2 string } var s *MyStruct = new(MyStruct) fmt.Printf("s: %p, s.Field1: %d, s.Field2: '%s'\n", s, s.Field1, s.Field2) // s.Field1 是 0, s.Field2 是 ""// 对于引用类型(不推荐,但可以这么做) var sl *[]int = new([]int) // sl 是 *[]int 类型,*sl 的值是 nil fmt.Printf("sl: %p, *sl == nil: %t\n", sl, *sl == nil) // *sl 是 nil,无法直接使用 append 等操作var m *map[string]int = new(map[string]int) // m 是 *map[string]int 类型,*m 的值是 nil fmt.Printf("m: %p, *m == nil: %t\n", m, *m == nil) // *m 是 nil,无法直接赋值
make
-
作用:
- 仅用于 slice、map 和 channel 这三种内置引用类型的创建。
- 它不仅分配内存,还会初始化这些类型的内部数据结构,使其立即可用。
-
语法:
- Slice:
make([]T, length, capacity)
或make([]T, length)
(capacity 默认为 length) - Map:
make(map[K]V, initialCapacity)
或make(map[K]V)
(initialCapacity 可选) - Channel:
make(chan T, bufferCapacity)
或make(chan T)
(bufferCapacity 可选,默认为0,即无缓冲)
- Slice:
-
返回值:
- 返回的是初始化后的类型
T
本身(例如[]int
,map[string]int
,chan int
),而不是指针。
- 返回的是初始化后的类型
-
适用类型:
- 只能是 slice, map, channel。
-
示例:
// 创建一个长度为 5,容量为 10 的 int 切片 s1 := make([]int, 5, 10) fmt.Printf("s1: %v, len: %d, cap: %d\n", s1, len(s1), cap(s1)) // s1: [0 0 0 0 0], len: 5, cap: 10 s1[0] = 100 // 可以直接使用// 创建一个初始容量(可选)的 map m1 := make(map[string]int) m1["age"] = 30 // 可以直接使用 fmt.Printf("m1: %v\n", m1)// 创建一个带缓冲的 channel ch1 := make(chan int, 1) ch1 <- 1 // 可以直接使用 fmt.Printf("Received from ch1: %d\n", <-ch1)
核心区别总结
特性 | new(T) | make(T, args...) |
---|---|---|
目的 | 分配内存,初始化为零值 | 创建并初始化 slice, map, channel 的内部结构 |
返回类型 | 指针 *T | 类型 T 本身 (slice, map, or channel) |
适用类型 | 任何类型 | 仅 slice, map, channel |
初始化 | 内存被清零 (zero value) | 初始化内部数据结构,使其立即可用 (non-nil) |
常见用途 | 获取指向零值变量的指针,尤其是结构体指针 | 创建可用的 slice, map, channel |
为什么 make
只用于 slice, map, channel?
这三种类型在 Go 中是引用类型,它们内部不仅仅是一块简单的内存区域,还包含了更复杂的数据结构:
- Slice: 内部包含指向底层数组的指针、长度(len)和容量(cap)。
make
会分配底层数组并设置这些元数据。 - Map: 内部通常是哈希表的实现。
make
会初始化这个哈希表结构。 - Channel: 内部包含用于 goroutine 间同步和通信的机制,可能还有缓冲区。
make
会设置这些。
如果对这些类型使用 new
:
var s *[]int = new([]int) // *s 是一个 nil slice
var m *map[string]int = new(map[string]int) // *m 是一个 nil map
var c *chan int = new(chan int) // *c 是一个 nil channel
你会得到一个指向 nil
slice/map/channel 的指针。这个 nil
状态的引用类型是不能直接使用的(例如,不能向 nil
map 添加键值对,不能向 nil
slice append
元素,不能向 nil
channel 发送数据)。你需要先用 make
来初始化它们。
何时使用哪个?
-
使用
new(T)
:- 当你需要一个指向某个类型
T
的变量,并且希望它被初始化为其零值时。 - 最常见的场景是为结构体分配内存并获取其指针,然后填充字段:
这等价于:type Point struct{ X, Y int } p := new(Point) // p 是 *Point,p.X 和 p.Y 都是 0 p.X = 10
或者更简洁的复合字面量:var p Point // p 是 Point,p.X 和 p.Y 都是 0 ptr := &p // ptr 是 *Point ptr.X = 10
p := &Point{} // p 是 *Point,p.X 和 p.Y 都是 0 p.X = 10
- 当你需要一个指向某个类型
-
使用
make(T, args...)
:- 当你需要创建一个 slice、map 或 channel,并希望它们被正确初始化以便立即使用时。这是创建这三种类型的标准方式。
记住这个简单的规则:
- 要创建 slice, map, channel,请使用
make
。 - 要为其他类型(如 int, string, struct, array)分配内存并获取指向其零值的指针,请使用
new
(或者更常见的,使用复合字面量&T{}
)。
相关文章:
Go语言中new与make的深度解析
在 Go 语言中,new 和 make 是两个用于内存分配的内置函数,但它们的作用和使用场景有显著区别。 理解它们的核心在于: new(T): 为类型 T 分配内存,并将其初始化为零值,然后返回一个指向该内存的指针 (*T)。make(T, ar…...
Xilinx 7Series\UltraScale 在线升级FLASH STARTUPE2和STARTUPE3使用
一、FPGA 在线升级 FPGA 在线升级FLASH时,一般是通过逻辑生成SPI接口操作FLASH,当然也可以通过其他SOC经FPGA操作FLASH,那么FPGA就要实现在启动后对FLASH的控制。 对于7Series FPGA,只有CCLK是专用引脚,SPI接口均为普…...
redisson-spring-boot-starter 版本选择
以下是更详细的 Spring Boot 与 redisson-spring-boot-starter 版本对应关系,按照 Spring Boot 主版本和子版本细分: 1. Spring Boot 3.x 系列 3.2.x 推荐 Redisson 版本:3.23.1(最新稳定版,兼容 Redis 7.x…...
QML定时器Timer和线程任务WorkerScript
定时器 Timer 属性 interval: 事件间隔毫秒repeat: 多次执行,默认只执行一次running: 定时器启动triggeredOnStart: 定时器启动时立刻触发一次事件 信号 triggered(): 定时时间到,触发此信号 方法 restart(): 重启定时器start(): 启动定时器stop(): 停止…...
Jsoup解析商品信息具体怎么写?
使用 Jsoup 解析商品信息是一个常见的任务,尤其是在爬取电商网站的商品详情时。以下是一个详细的步骤和代码示例,展示如何使用 Jsoup 解析商品信息。 一、准备工作 确保你的项目中已经添加了 Jsoup 依赖。如果你使用的是 Maven,可以在 pom.…...
jenkins数据备份
jenkins数据备份一般情况下分为两种, 1.使用crontab进行备份.这种备份方式是技术人员手动填写的备份的时候将workspace目录排除. 2.使用jenkins插件备份. 下载备份插件 ThinBackup,这里已经下载完成,如果没下载的情况下点击 安装好之后重启jenkins(直接点击插件安装位置的闲…...
IP核警告,Bus Interface ‘AD_clk‘: ASSOCIATED_BUSIF bus parameter is missing.
创建IP核生成输出的clk信号无法在GUI(customization GUI)显示clk信号,并且出现如下2个warning: [IP_Flow 19-3153] Bus Interface AD_clk: ASSOCIATED_BUSIF bus parameter is missing. [IP_Flow 19-4751] Bus Interface AD_clk:…...
Nginx配置同一端口不同域名或同一IP不同端口
以下是如何在Nginx中配置同一端口不同域名,以及同一IP不同端口的详细说明: 一、同一端口不同域名(基于名称的虚拟主机) 场景: 通过80端口,让 example.com 和 test.com 指向不同的网站目录(如 /…...
一键启动多个 Chrome 实例并自动清理的 Bash 脚本分享!
目录 一、📦 脚本功能概览 二、📜 脚本代码一览 三、🔍 脚本功能说明 (一)✅ 支持批量启动多个 Chrome 实例 (二)✅ 每个实例使用独立用户数据目录 (三)✅ 启动后自…...
LLaMA-Adapter
一、技术背景与问题 1.1 传统方法的数学局限 二、LLaMA-Adapter 核心技术细节 2.1 Learnable Adaption Prompts 的设计哲学 这种零初始化注意力机制的目的是在训练初期稳定梯度,避免由于随机初始化的适配提示带来的不稳定因素。通过门控因子gl的自适应调整,在训…...
鸿蒙电脑系统和统信UOS都是自主可控的系统吗
鸿蒙电脑系统(HarmonyOS)和统信UOS(Unity Operating System)均被定位为自主可控的操作系统,但两者的技术背景、研发路径和生态成熟度存在差异,需结合具体定义和实际情况分析: 1. 鸿蒙系统&#…...
【Unity 如何使用 Mixamo下载免费模型/动画资源】Mixamo 结合在 Unity 中的实现(Animtor动画系统,完整配置以及效果展示)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Mixamo介绍1、网址2、Mixamo功能介绍Mixamo 的核心功能Mixamo 适用场景二、Mixamo下载免费模型三、Mixamo下载免费动画四、导入Unity1.人物模型配置2.动画配置五、场景配置和效果测试1.人物…...
linux文件重命名命令
Linux文件重命名指南 方法一:mv命令(单文件操作) mv 原文件名 新文件名基础用法示例: mv old_file.txt new_name.txt保留扩展名技巧: mv document-v1.doc document-v2.doc方法二:rename命令(…...
JavaScript-DOM-02
自定义属性: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…...
跨部门项目管理优化:告别邮件依赖
1. 工具整合 1.1 协作平台集中化 1.1.1 一体化协作工具优势 使用Microsoft Teams、Slack等一体化协作工具替代邮件,集成即时消息、文件共享、任务分配和视频会议功能,减少工具切换成本,提高沟通效率。 1.1.2 具体应用案例 在Teams中创建项目频道,关联任务看板(Planner)…...
ADB常用语句
目录 基本语句 pm 包管理操作 查看文件夹内容 查看文件内容 删除文件 dumpsys查看系统服务状态 logcat保存日志 日志级别 基本语句 查看是否安装成功 adb version查看是否连接成功 adb devices断开连接 adb disconnect进入安卓系统 adb shell 退出安卓系统 exit…...
阿里发布扩散模型Wan VACE,全面支持生图、生视频、图像编辑,适配低显存~
项目背景详述 推出与目的 Wan2.1-VACE 于 2025 年 5 月 14 日发布,作为一个综合模型,旨在统一视频生成和编辑任务。其目标是解决视频处理中的关键挑战,即在时间和空间维度上保持一致性。该模型支持多种任务,包括参考到视频生成&a…...
谷歌开源轻量级多模态文本生成模型:gemma-3n-E4B-it-litert-preview
一、Gemma 3n模型概述 1.1 模型简介 Gemma 3n是Google DeepMind开发的一系列轻量级、最先进的开源模型。这些模型基于与Gemini模型相同的研究和技术构建,适合多种内容理解任务,如问答、摘要和推理等。 1.2 模型特点 Gemma 3n模型专为在资源受限设备上…...
【Linux】了解 消息队列 system V信号量 IPC原理
🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、了解消息队列 ✨消息队列函数 🍔ftok() --- 系统调用设置key 🍔 msgget() 🍔msgctl() 🍔msgsnd() ✨消息队列的管理指令 二、了…...
Git Clone 原理详解:为什么它比本地文件复制更快? -优雅草卓伊凡
Git Clone 原理详解:为什么它比本地文件复制更快? -优雅草卓伊凡 今天有朋友问我:“为什么 git clone 下载文件这么快?而我在本地复制粘贴文件时,速度却慢得多?” 这个问题很有意思,因为它涉及…...
高级认知型Agent
目标: 构建一个具备自主规划、多步推理、工具使用、自我反思和环境交互能力的智能代理,使其能够高效、可靠地完成复杂任务。 核心理念: Agent的智能涌现于一个精密的认知循环: 感知 (Perceive) -> 理解与规划 (Think/Plan - 想) -> 信息获取 (Search/Act - 查) -&g…...
网络爬虫(Web Crawler)详解
网络爬虫(Web Crawler)详解 1. 基本概念与核心目标 定义: 网络爬虫是一种自动化的程序,通过HTTP协议访问网页,提取并存储数据(如文本、链接、图片),并根据策略递归访问新链接。核心目标: 数据采集:抓取特定网站或全网公开数据。索引构建:为搜索引擎提供页面内容(如…...
SQL 数值计算全解析:ABS、CEIL、FLOOR与ROUND函数深度精讲
一、问题拆解:数值计算需求分析 1.1 业务需求转换 题目:在numbers表中计算每个数值的绝对值、向上取整、向下取整和四舍五入值。 关键分析点: 需要对同一字段进行四种不同的数学运算每种运算对应一个特定的SQL数学函数需保持原始数据完整…...
智能导览系统多语言解说与AI问答功能:从deepseek到景区知识图谱的构建
本文面向 文旅行业技术决策者、GIS 开发者、AI 算法工程师,旨在解决不够智能化导致游客体验不足的核心痛点,提供从技术选型到落地部署的全链路解决方案。 如需获取智慧景区导览系统解决方案请前往文章最下方获取,如有项目合作及技术交流欢迎私…...
10.18 LangChain ToolMessage实战:多轮交互与状态管理全解析
使用 ToolMessage 管理工具调用输出 关键词:LangChain ToolMessage, 工具调用管理, 多轮交互控制, 状态持久化, 输出解析 1. ToolMessage 的定位与价值 在 LangChain v0.3 的 Agent 工作流中,ToolMessage 是专门用于管理工具调用输出的消息类型,主要解决以下核心问题: #m…...
linux基础操作11------(运行级别)
一.前言 这个是linux最后一章节内容,主要还是介绍一下,这个就和安全有关系了,内容还是很多的,但是呢,大家还是做个了解就好了。 二.权限掩码 运行级别 0 关机 运行级别 1 单用户 ,这个类似于windows安全…...
Python Ray 扩展指南
Python Ray 扩展指南 Ray 是一个开源的分布式计算框架,专为扩展 Python 应用程序而设计,尤其在人工智能和机器学习领域表现出色。它提供了简单的 API,使开发者能够轻松编写并行和分布式代码,而无需关注底层复杂性。以下是关于 Py…...
笑林广记读书笔记三
《锯箭杆》 一人往观武场,飞箭误中其臂。请外科医治疗,医遂用小锯截其外露箭杆,即索谢礼。 问:“内截箭头如何?” 医曰:“此是内科的事,你去找他们。” 白话翻译: 有…...
npm、pnpm、yarn 各自优劣深度剖析
在前端开发领域,包管理工具是开发者的得力助手,它们负责处理项目中的依赖安装、更新与管理。npm、pnpm、yarn 是目前最主流的三款包管理工具,它们在功能上有诸多相似之处,但在实际使用中又各有优劣。本文将结合包管理工具常见问题…...
Ulisses Braga-Neto《模式识别和机器学习基础》
模式识别和机器学习基础 [专著] Fundamentals of pattern recognition and machine learning / (美)乌利塞斯布拉加-内托(Ulisses Braga-Neto)著 ; 潘巍[等]译 推荐这本书,作者有自己的见解,而且提供代码。问题是难度高,对于初学…...
python查询elasticsearch 获取指定字段的值的list
from elasticsearch import Elasticsearch from datetime import datetime, timedelta# 1.connect to Elasticsearch------------------------------------------------------------------------------------------------------ # prod连接到 Elasticsearch es_of_prod Elasti…...
百度Q1财报:总营收325亿元超预期 智能云同比增速达42%
发布 | 大力财经 5月21日晚,百度发布2025年第一季度财报,显示一季度总营收达325亿元,百度核心营收255亿元,同比增长7%,均超市场预期。一季度,百度核心净利润同比增48%至76.3亿元,智能云持续强劲…...
BurpSuite Montoya API 详解
文章目录 前言1. API 结构1.1 概述1.2 API文件源码解析 2. BurpExtension 接口3. MontoyaApi接口4. package burp.api.montoya.proxy4.1 Proxy 接口4.2 ProxyRequestHandler接口4.3 Demo 5. BurpSuite burpSuite()6. Extension extension()7. Http http()参考 前言 我们已经学…...
oracle使用SPM控制执行计划
一 SPM介绍 Oracle在11G中推出了SPM(SQL Plan management),SPM是一种主动的稳定执行计划的手段,能够保证只有被验证过的执行计划才会被启用,当由于种种原因(比如统计信息的变更)而导致目标SQL产生了新的执…...
YCKC【二分查找专题】题解
数的范围题解点击跳转题目链接:数的范围 比较经典的二分查找例题,不做过多赘述。注意看二分的对象以及最终想求什么:想求尽可能大 ,那么就是最大值类型的二分;想求尽可能小,就是最小值类型的二分。注意二分…...
【Java高阶面经:微服务篇】8.高可用全链路治理:第三方接口不稳定的全场景解决方案
一、第三方接口治理的核心挑战与架构设计 1.1 不稳定接口的典型特征 维度表现影响范围响应时间P99超过2秒,波动幅度大(如100ms~5s)导致前端超时,用户体验恶化错误率随机返回5xx/429,日均故障3次以上核心业务流程中断,交易失败率上升协议不一致多版本API共存,字段定义不…...
关于FPGA 和 ASIC设计选择方向的讨论
FPGA 和 IC 设计怎么选?哪个发展更好? 一句话总结: 如果你学历极高,追求高薪资、愿意投入长期学习,目标是进入大型芯片公司,建议走 IC(ASIC)设计;如果你更看重灵活性、创…...
项目中常用的docker指令
1. docker ps 查看当前正在运行的容器。 docker ps -a 这将列出所有容器,包括停止运行的。 2. docker exec 在已经运行的容器中执行命令的工具 启动一个交互式 Bash 会话 docker exec -it my-container bash介绍 docker exec 命令 docker exec 是 Docker 提供的…...
以加减法计算器为例,了解C++命名作用域与函数调用
************* C topic: 命名作用域与函数调用 ************* The concept is fully introducted in the last artical. Please refer to 抽象:C命名作用域与函数调用-CSDN博客 And lets make a calculator to review the basic structure in c. 1、全局函数 A…...
MySQL EXPLAIN 使用详解与执行计划分析优化
MySQL EXPLAIN 使用详解与执行计划分析优化 一、什么是 EXPLAIN? EXPLAIN 是 MySQL 提供的 SQL 语句分析工具,可以显示 SQL 语句在执行时的执行计划,包括表的访问顺序、使用的索引、连接类型、扫描行数等。通过分析 EXPLAIN 的输出结果&…...
Arthas:Java诊断利器实战指南
在Java应用开发和运维中,线上问题排查往往是一场与时间的赛跑。传统的日志分析、重启大法或JVM工具(如jstack、jmap)虽然有效,但存在操作复杂、无法实时追踪等问题。Arthas作为阿里巴巴开源的Java诊断工具,凭借无需重启…...
一文读懂迁移学习:从理论到实践
在机器学习和深度学习的快速发展历程中,数据和计算资源成为了制约模型训练的关键因素。当我们面对新的任务时,重新训练一个从头开始的模型往往耗时耗力,而且在数据量不足的情况下,模型的性能也难以达到理想状态。这时,…...
ElasticSearch安装
ElasticSearch 脑图知识图谱地址:ProcessOn Mindmap|思维导图 简介 ES是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建,专为处理海量数据设计,支持实时搜索、分析和可视化。 排行第一的搜索引擎 官网地址࿱…...
c#中添加visionpro控件(联合编程)
vs添加vp控件 创建窗体应用 右键选择项 点击确定 加载CogAcqfifoTool工具拍照 设置参数保存.vpp 保存为QuickBuild或者job, ToolBlock 加载保存的acq工具 实例化相机工具类 //引入命名空间 using Cognex.VisionPro; //实例化一个相机工具类 CogAcqFifoTool cogAcqFifoTool n…...
MySQL主键与外键详解:数据关系的基石与守护者
引言 在数据库设计中,主键(Primary Key)和外键(Foreign Key)是构建数据关系模型的核心工具。它们不仅保障了数据的唯一性和完整性,还实现了跨表数据关联的逻辑闭环。本文将通过实例解析这两大关键概念&…...
Go语言打造:超高性能分布式唯一ID生成工具
一、简介 这是一个超高性能唯一ID生成工具,支持docker一键部署,提供API接入功能支持高性能生成Snowflake ID、Sonyflake ID、UUID v1、UUID v4、XID、KSUID以及自定义ID的服务可以用来生成订单编号、学号、高标准唯一标识、有序ID等等开源地址参考&#…...
列表计量单位显示
列表计量单位显示 E:\javaDev\tender-project-vben5\apps\web-antd\src\views\tender\material\data.ts import type { FormSchemaGetter } from #/adapter/form; import type { VxeGridProps } from #/adapter/vxe-table;import { getDictOptions } from #/utils/dict; impor…...
RAG系统的现实困境与突破:数据泥潭到知识自由
一、当前RAG系统的核心痛点 1. 数据处理的阿喀琉斯之踵 知识形态的暴力归一化:将PDF、视频、数据库等异构数据强行转化为统一文本,导致: 纸质文献中的数学公式OCR错误率高达37%(ICDAR2023数据)流程图/思维导图等非连续…...
项目执行中缺乏问题记录和总结,如何改进?
要有效改进项目执行中的问题记录与总结机制,应采取建立标准化问题记录流程、引入专业管理工具、定期开展问题复盘、设立知识库系统、强化团队总结意识等措施。其中,建立标准化问题记录流程是核心。没有统一流程,问题易被忽视、重复发生&#…...
docker中使用openresty
1.为什么要使用openresty 我这边是因为要使用1Panel,第一个最大的原因,就是图方便,比较可以一键安装。但以前一直都是直接安装nginx。所以需要一个过度。 2.如何查看openResty使用了nginx哪个版本 /usr/local/openresty/nginx/sbin/nginx …...