Go中slice和map引用传递误区
背景
关于slice和map是指传递还是引用传递,很多文章都分析得模棱两可,其实在Go中只有值传递,但是很多情况下是因为分不清slice和map的底层实现,所以导致很多人在这一块产生疑惑,下面通过代码案例分析slice和map到底是值传递还是引用传递。
案例分析
func main() {list := make([]int, 10)fmt.Printf("list addr:%p\n", list)fmt.Println("list size:", len(list))listExpand(list)fmt.Println("expand list size:", len(list))m := make(map[int]int, 0)fmt.Printf("map addr:%p\n", m)fmt.Println("map size:", len(m))mapExpand(m)fmt.Println("expand size:", len(m))
}func mapExpand(m map[int]int) {for i := range 10 {m[i] = i}fmt.Printf("expand map addr:%p\n", m)
}func listExpand(list []int) {for i := range 10 {list = append(list, i)}fmt.Printf("expand list addr:%p\n", list)
}
上面代码的输出结果:
list addr:0xc000010500
list size: 10
expand list addr:0xc0000220a0
expand list size: 10
map addr:0xc00001e180
map size: 0
expand map addr:0xc00001e180
expand size: 10
可以清楚的看到,都没有使用指针的情况下,两者的结果都不一样,map在扩容前后都是同一个内存地址,但是slice在没扩容都不为同一个内存地址。
可能会更疑惑了,这结果是想说明,map是引用传递,slice是值传递吗?
在Go的1.8版本源码中
hashmap的make实现如下:

可以清楚的看到,通过make创建的map其实返回的是hamp结构体的指针。
slice的make实现如下:

可以清楚的看到,通过make创建的slice其实返回的是slice的结构体,并不是指针。
所以,结论很清晰了,其实Go中只有值传递,因为各个引用类型底层实现的不同导致的结果不一致,因为创建map返回的是指针,所以传递map时,扩容了也不会导致和预期不一样的结果;而slice的创建返回的是结构体,如果扩容了,则会导致底层数组的变化,不一定是预期的结果。
相关文章:
Go中slice和map引用传递误区
背景 关于slice和map是指传递还是引用传递,很多文章都分析得模棱两可,其实在Go中只有值传递,但是很多情况下是因为分不清slice和map的底层实现,所以导致很多人在这一块产生疑惑,下面通过代码案例分析slice和map到底是…...
C# Unity 唐老狮 No.2 模拟面试题
本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体…...
【Uniapp-Vue3】开发userStore用户所需的相关操作
在项目根路径下创建的stores文件夹中创建user.js文件 并将以下内容复制到user.js中 import {ref} from "vue" import { defineStore } from pinia; const uniIdCo uniCloud.importObject("uni-id-co") const db uniCloud.database(); const usersTable…...
DeepSeek开源周首日:发布大模型加速核心技术可变长度高效FlashMLA 加持H800算力解码性能狂飙升至3000GB/s
FlashMLA的核心技术特性包括对BF16精度的全面支持,以及采用块大小为64的页式键值缓存(Paged KV Cache)系统,实现更精确的内存管理。在性能表现方面,基于CUDA12.6平台,FlashMLA在H800SXM5GPU上创下了显著成绩…...
易语言模拟真人鼠标轨迹算法 - 防止游戏检测
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
DeepSeek 提示词:基础结构
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
文件系统
目录 1.认识磁盘 磁盘的物理结构 CHS定位法 磁盘的逻辑结构 2.认识文件系统 inode 分区和分组 磁盘上的文件系统 3.软硬链接 软链接 软链接的操作 创建软链接 查看软链接 删除软链接 软链接的特点 软链接的使用场景 硬链接 硬链接的操作 创建硬链接 查看硬…...
力扣LeetCode:1472 设计浏览器历史记录
题目: 你有一个只支持单个标签页的 浏览器 ,最开始你浏览的网页是 homepage ,你可以访问其他的网站 url ,也可以在浏览历史中后退 steps 步或前进 steps 步。 请你实现 BrowserHistory 类: BrowserHistory(string h…...
【FL0091】基于SSM和微信小程序的社区二手物品交易小程序
🧑💻博主介绍🧑💻 全网粉丝10W,CSDN全栈领域优质创作者,博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发…...
【笔记ing】每天50个英语词汇
ex- e-out exclude 排外,排除 expect 期待,期望 单词构成: 前缀(prefix):情感(emotion)方向(orientation) 词根(root)…...
联想 SR590 服务器 530-8i RAID 控制器更换损坏的硬盘
坏了的硬盘会自动亮黄灯。用一个空的新盘来替换,新盘最好不要有东西。但是有东西可能也没啥,因为我看 RAID 控制器里有格式化的选项 1. 从 IPMI 把服务器关机,电源键进入绿色闪烁状态 2. 断电,推开塑料滑块拉出支架,…...
Java基础关键_012_包装类
目 录 一、基本数据类型对应的包装类 1.概览 2.说明 二、包装类 1.最大值与最小值 2.构造方法 3.常用方法(Integer为例) (1)compare(int x, int y) (2)max(int a, int b) 和 min(int a, int b) &…...
【react】TypeScript在react中的使用
目录 一、环境与项目配置 1. 创建 TypeScript React 项目 2. 关键tsconfig.json配置 3.安装核心类型包 二、组件类型定义 1. 函数组件(React 18) 2.类组件 三、Hooks 的深度类型集成 1. useState 2. useEffect 3. useRef 4. 自定义 Hook 四、事…...
vllm的使用方式,入门教程
vLLM是一个由伯克利大学LMSYS组织开源的大语言模型推理框架,旨在提升实时场景下的大语言模型服务的吞吐与内存使用效率。以下是详细的vLLM使用方式和入门教程: 1. 前期准备 在开始使用vLLM之前,建议先掌握一些基础知识,包括操作…...
IDEA 使用codeGPT+deepseek
一、环境准备 1、IDEA 版本要求 安装之前确保 IDEA 处于 2023.x 及以上的较新版本。 2、Python 环境 安装 Python 3.8 或更高版本 为了确保 DeepSeek 助手能够顺利运行,您需要在操作系统中预先配置 Python 环境。具体来说,您需要安装 Python 3.8 或更高…...
vue3中测试:单元测试、组件测试、端到端测试
1、单元测试:单元测试通常适用于独立的业务逻辑、组件、类、模块或函数,不涉及 UI 渲染、网络请求或其他环境问题。 describe(increment, () > {// 测试用例 }) toBe():用于严格相等比较(),适用于原始类…...
机器学习介绍与数据集
一、机器学习介绍与定义 1.1 机器学习定义 机器学习(Machine Learning)是让计算机从数据中自动学习规律,并依据这些规律对未来数据进行预测的技术。它涵盖聚类、分类、决策树、贝叶斯、神经网络、深度学习(Deep Learning…...
React 源码揭秘 | 更新队列
前面几篇遇到updateQueue的时候,我们把它先简单的当成了一个队列处理,这篇我们来详细讨论一下这个更新队列。 有关updateQueue中的部分,可以见源码 UpdateQueue实现 Update对象 我们先来看一下UpdateQueue中的内容,Update对象&…...
关于网络端口探测:TCP端口和UDP端口探测区别
网络端口探测是网络安全领域中的一项基础技术,它用于识别目标主机上开放的端口以及运行在这些端口上的服务。这项技术对于网络管理和安全评估至关重要。在网络端口探测中,最常用的两种协议是TCP(传输控制协议)和UDP(用…...
Vue.js 中使用 JSX 自定义语法封装组件
Vue.js 中使用 JSX 自定义语法封装组件 在 Vue.js 开发中,使用模板语法是常见的构建用户界面方式,但对于一些开发者,特别是熟悉 JavaScript 语法的,JSX 提供了一种更灵活、更具表现力的替代方案。通过 JSX,我们可以在…...
从技术到管理:一名一线开发者的转型心路历程
从技术到管理:一名一线开发者的转型心路历程 在技术行业,许多开发者都曾面临一个关键选择:是继续深耕技术,还是转型为管理者?这条转型之路充满挑战与成长,既是对个人能力的考验,也是对职业规划…...
Redis高危漏洞CVE-2025-49844(RediShell)详解:13年Lua脚本UAF漏洞可实现远程代码执行(RCE)
Download Redis Logo in SVG Vector or PNG File Format - Logo.wine Redis官方已针对CVE-2025-49844漏洞发布安全公告。该漏洞是Lua脚本引擎中的“释放后使用”(Use-After-Free,UAF)内存损坏问题,可被已认证攻击者利用恶意Lua脚…...
ChibiPIO-STM32F0:专为Cortex-M0优化的ChibiOS定制发行版
1. 项目概述ChibiPIO-STM32F0 是一个面向 STM32F0 系列微控制器的定制化 ChibiOS/RT 嵌入式实时操作系统发行版,其核心定位并非独立开发的新RTOS,而是对上游 ChibiOS/RT 源码树进行深度裁剪、适配与封装后的专用构建产物。它完整继承 ChibiOS/RT 的轻量级…...
SGP40气体传感器驱动与VOC指数测量实战指南
1. 项目概述Sensirion SGP40 是一款专为室内空气质量(IAQ)监测设计的数字式气体传感器,采用金属氧化物(MOx)传感技术,通过测量挥发性有机化合物(VOC)引起的电导率变化,间…...
ExifToolGUI:让图片元数据管理变得如此简单的5个实用技巧
ExifToolGUI:让图片元数据管理变得如此简单的5个实用技巧 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 你是否曾经面对成百上千张照片,需要批量修改拍摄时间、添加GPS定位信息&…...
鸿蒙 HarmonyOS 6 | Media Kit 屏幕捕获填充模式迁移详解
文章目录前言一、填充模式真正影响的是什么二、代码里最关键的是策略对象和调用时序三、适配时别只看设备类型,先看内容和输出比例四、排查方式总结前言 做屏幕录制时,最容易被忽略的一层,是捕获源尺寸和目标输出尺寸并不总是一致。手机长屏…...
c语言的优点介绍
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。接下来,小编为您介绍了c语言的优点介绍,感谢您的阅读! 1、简洁紧…...
YOLO-Master 与 YOLO 开始吭
AI Agent 时代的沙箱需求 从 Copilot 到 Agent:执行能力的质变 在生成式 AI 的早期阶段,应用主要以“Copilot”形式存在,AI 仅作为辅助生成建议。然而,随着 AutoGPT、BabyAGI 以及 OpenAI Code Interpreter(现为 Advan…...
@所有管理者:5分钟让“龙虾”进化为“视觉智能管家”!
一见视觉Skill入驻ClawHub!无需复杂配置与高额成本,即可打造专属“数字店长/数字厂长”,让管理更安心。 现开启内测,首批体验官将优先享有专属体验权益! 巡检靠跑、反馈靠等、复盘靠猜? 连锁门店与工厂车…...
YOLO12镜像问题解决:服务异常重启、参数调整技巧
YOLO12镜像问题解决:服务异常重启、参数调整技巧 1. YOLO12镜像常见问题诊断 1.1 服务异常重启问题排查 YOLO12镜像采用Supervisor进行进程管理,当遇到服务异常时,可以按照以下步骤排查: 检查服务状态: supervisorc…...
