golang关于slice map函数传参的小问题

问题

  1. 函数传参了一个slice,在函数内触发了对长度的修改(添加或删除),但是未影响函数外的实参
  2. 由此产生了另一个问题,我们用map在函数内修改会不会有影响不到实参的情况?

结论

  1. map作为函数参数时是引用传递,操作的始终是同一个对象

  2. slice作为函数参数时是引用传递。但是若函数内部对slice参数有append赋值时,则不再是同一个对象

过程

其实上面的问题与两点有关

  1. golang只有值传递
  2. map在源码中实际是一个指向hmap的指针,但是slice实际是一个struct
type SliceHeader struct {
Data unitptr
Len int
Cap int
}

这样当我们通过切片进行函数传参的时候,实际长底下的样子
在这里插入图片描述
由于是值拷贝,所以形参只是把Data的值(一个地址),Len和Cap的值copy了过来,这样当触发了长度变化的时候,Len的变化不会影响到实参,Data再重新扩容后也会指向新的地方,所以会带来上面的问题

那么map为啥没这个问题呢?因为map本身就是一个指针,值拷贝的结果是下图这样的
在这里插入图片描述
而map本身在扩容的时候是直接修改的hmap中的老桶和新桶,那么当对形参进行修改的时候,由于他俩的指向同一个位置,所以即使我们在函数内触发了扩容,对外面也没有影响

抛砖引玉

参考:
https://www.cnblogs.com/beatle-go/p/17898561.html
https://blog.csdn.net/ezreal_pan/article/details/132106944
https://blog.csdn.net/vince1998/article/details/137073224
https://blog.csdn.net/yzf279533105/article/details/89461651
https://www.idc.net/help/333207/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/418634.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP 拥塞控制

概念详解 TCP拥塞控制是网络通信中的一个关键机制,它通过动态调整发送数据的速率来避免网络拥塞。以下是TCP拥塞控制的详细概念解释: 拥塞窗口(CWND, Congestion Window): 定义:发送方在收到接收方的确认(…

Java 面试题:通过JProfile排查OOM问题 内存溢出与内存泄漏问题 --xunznux

文章目录 如何通过JProfile排查OOM或内存泄漏问题1、启动工具观测程序执行状态2、使用默认设置采样3、查看memory,Run GC无效4、查看 Live Memory发现两个byte大数组存在5、通过快照查看堆中的内存使用情况6、找到Full GC无法清除的对象通过大对象列表定位内存泄漏问…

【SpringBoot】电脑商城-12-订单功能

创建订单 1 订单-创建数据表 1.使用use命令先选中store数据库。 USE store;2.在store数据库中创建t_order和t_order_item数据表。 CREATE TABLE t_order (oid INT AUTO_INCREMENT COMMENT 订单id,uid INT NOT NULL COMMENT 用户id,recv_name VARCHAR(20) NOT NULL COMMENT …

Mac 上 YYDS 的自动切换输入法工具:好用到原地炸裂式起飞

有一种幸福的状态就是 任何时刻你都可以全力以赴 被打断、被终止也没有遗憾 因为你对结果没有那么期待 而且已经用尽全力了 当你深刻认识到你所做的事情 是多么好的时候 自然会产生一种想要分享出去 的心情 如今社会大部分工作都被电脑化了,在很多方面我们的…

第140天:内网安全-横向移动局域网ARP欺骗DNS劫持钓鱼中间人单双向

目录 案例一:局域网&工作组-ARP原理-断网限制-单向 案例二:局域网&工作组-ARP欺骗-劫持数据-双向 案例三:局域网&工作组-DNS 劫持-钓鱼渗透-双向 案例一:局域网&工作组-ARP原理-断网限制-单向 原理&#xff1…

数据库MySQL基础

目录 一、数据库的介绍 1.数据库概述 (1)数据的存储方式 (2)数据库 2.常见数据库排行榜 二、数据库的安装与卸载 1.数据库的安装 2.数据库的卸载 三、数据库服务的启动与登录 1.Windows 服务方式启动 (1&…

Java反序列化漏洞-TemplatesImpl利用链分析

文章目录 一、前言二、正文1. 寻找利用链2. 构造POC2.1 生成字节码2.2 加载字节码1)getTransletInstance2)defineTransletClasses 2.3 创建实例 3. 完整POC 三、参考文章 一、前言 java.lang.ClassLoader#defineClass defineClass可以加载字节码&…

相机常见名词详解

本文主要参考超人视觉课程做的笔记,有讲解不太懂的,又做了详细的解释 1、物距:物体到镜片的距离; 2、像距:像到镜片的距离; 3、焦距:镜片到焦点的距离; (1)二倍焦距以外&#xff…

AF路由模式组网部署

实验拓扑 防火墙基本配置 接口配置 eth1 eth2 eth3 路由配置 地址转换配置 放通策略 1. 出口申请了主电信、备联通两条外网线路(均为 50M 带宽)。 2. 内网有 web 服务器linux 172.16.3.100运行 http 服务,内外网用户通过 出口路由器…

用PG Back Web轻松进行PostgreSQL备份

什么是 PG Back Web ? PG Back Web 🐘 使用用户友好的 Web 界面轻松进行 PostgreSQL 备份!🌐💾。PG Back Web 不仅仅是另一个备份工具。借助 PG Back Web,用户可以通过受 PGP 加密保护的直观 Web 界面轻松安…

【redis】数据量庞大时的应对策略

文章目录 为什么数据量多了主机会崩分布式系统应用数据分离架构应用服务集群架构负载均衡器数据库读写分离 引入缓存冷热分离架构 分库分表微服务是什么代价优势 为什么数据量多了主机会崩 一台主机的硬件资源是有上限的,包括但不限于一下几种: CPU内存…

【Postgresql】地理空间数据的存储与查询,查询效率优化策略,数据类型与查询速度的影响

注:使用postgresql数据库会用到PostGIS 扩展。 一、安装PostGIS 扩展 在 PostgreSQL 中遇到错误 “type geography does not exist” 通常意味着你的 PostgreSQL 数据库还没有安装 PostGIS 扩展,或者 PostGIS 扩展没有被正确地安装在你的数据库中。geo…

我司使用了两年的高效日志打印工具,非常牛逼!

为了更方便地排查问题,电商交易系统的日志中需要记录用户id和订单id等字段。然而,每次打印日志都需要手动设置用户id,这一过程非常繁琐,需要想个办法优化下。 log.warn("user:{}, orderId:{} 订单提单成功",userId, or…

linux服务器之top命令详解

top:系统资源管理器 top命令类似于windows的任务管理器,可以查看内存、cpu、进程等信息(动态查看系统资源信息)在linux系统中常用top命令查看资源性能分析工具 一、参数释义: 第一行 系统时间和平均负载 top:名称22:12:46&#…

Spring Boot 部署方案!打包 + Shell 脚本详解

本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作; profiles指定不同环境的配置 maven-assembly-plugin打发布压缩包 分享shenniu_publish.sh程序启动工具 linux上使用shenniu_p…

一文梳理RAG(检索增强生成)的现状与挑战

一 RAG简介 大模型相较于过去的语言模型具备更加强大的能力,但在实际应用中,例如在准确性、知识更新速度和答案透明度方面,仍存在不少问题,比如典型的幻觉现象。因此,检索增强生成 (Retrieval-Augmented Generation, …

哪种超声波清洗机效果好?较好的超声波眼镜清洗机品牌推荐

作为一名拥有20年戴镜经验的眼镜爱好者,我深深体会到眼镜清洁的挑战:微小缝隙里的污垢难以触及,频繁的脏污让我苦于找不到清洁时机,而用力不当的擦拭方法更是可能对眼镜特别是镜片造成伤害,这确实让人感到苦恼&#xf…

Java专栏介绍

专栏导读 在当今这个技术飞速发展的时代,Java作为一门成熟且广泛应用的编程语言,一直是软件开发领域的中坚力量。本“Java技术”专栏旨在帮助读者深入理解Java编程语言的精髓,掌握其核心概念与高级特性,并通过实战案例提升编程技…

字符编码转换

文章目录 1. 背景2. 解决方案3. 编码转换实现3.1 shell实现3.2 python实现3.3 开源工具实现 4. 常见中文字符编码介绍4.1 字符编码解决什么问题4.2 常见的中文字符编码4.3 常见中文字符编码关系4.4 unicide字符集与utf-8 1. 背景 在团队合作开发中,经常发现组员的代…

Redis安装步骤——离线安装与在线安装详解

Linux环境下Redis的离线安装与在线安装详细步骤 环境信息一、离线安装1、安装环境2、下载redis安装包3、上传到服务器并解压4、编译redis5、安装redis6、配置redis(基础配置)7、启动redis8、本机访问redis9、远程访问redis 二、在线安装1、更新yum源2、安…