当前位置: 首页 > article >正文

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.kler.cn/a/288392.html

相关文章:

  • JavaSecLab靶场搭建
  • C++算法练习-day40——617.合并二叉树
  • 985研一学习日记 - 2024.11.14
  • Javaweb—Ajax与jQuery请求
  • Scala学习记录,case class,迭代器
  • 什么岗位需要学习 OpenGL ES ?说说 3.X 的新特性
  • 娱乐小项目-树莓派履带小车
  • 中兴-ZSRV2路由器-任意文件读取
  • arcgisjs4.0 内网部署字体不显示问题处理
  • 【技术详解】Java泛型:全面解析与实战应用(进阶版)
  • sqli-labs靶场通关攻略(六十一关到六十五关)
  • ARM/Linux嵌入式面经(三十):腾讯 C++开发工程师
  • 【Linux学习】Linux开发工具——vim
  • html+css+js网页设计 博物馆 亚历山大美术馆6个页面
  • Flask中的g的作用
  • Linux学习笔记(4)----Debian压力测试方法
  • 日本IT编程语言对比分析-Python /Ruby /C++ /Java
  • 【加密社】马后炮视角来看以太坊二层战略
  • LLM大模型:不要怪大模型回答质量不行了,那是你不会问~
  • 计算机视觉之 SE 注意力模块
  • 微信小程序接入客服功能
  • 逆向工程核心原理 Chapter23 | DLL注入
  • 【舍入,取整,取小数,取余数丨Excel 函数】
  • 探索四川财谷通信息技术有限公司抖音小店的独特魅力
  • 收银系统源码-收银台UI自定义
  • 51单片机-第九节-AT24C02存储器(I2C总线)