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

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的创建返回的是结构体,如果扩容了,则会导致底层数组的变化,不一定是预期的结果。

http://www.lryc.cn/news/543499.html

相关文章:

  • C# Unity 唐老狮 No.2 模拟面试题
  • 【Uniapp-Vue3】开发userStore用户所需的相关操作
  • DeepSeek开源周首日:发布大模型加速核心技术可变长度高效FlashMLA 加持H800算力解码性能狂飙升至3000GB/s
  • 易语言模拟真人鼠标轨迹算法 - 防止游戏检测
  • DeepSeek 提示词:基础结构
  • 文件系统
  • 力扣LeetCode:1472 设计浏览器历史记录
  • 【FL0091】基于SSM和微信小程序的社区二手物品交易小程序
  • 【笔记ing】每天50个英语词汇
  • 联想 SR590 服务器 530-8i RAID 控制器更换损坏的硬盘
  • Java基础关键_012_包装类
  • 【react】TypeScript在react中的使用
  • vllm的使用方式,入门教程
  • IDEA 使用codeGPT+deepseek
  • vue3中测试:单元测试、组件测试、端到端测试
  • 机器学习介绍与数据集
  • React 源码揭秘 | 更新队列
  • 关于网络端口探测:TCP端口和UDP端口探测区别
  • Vue.js 中使用 JSX 自定义语法封装组件
  • 设计模式教程:备忘录模式(Memento Pattern)
  • 使用 C# 以api的形式调用 DeepSeek
  • CS5366AN:高集成Type-C转HDMI 4K60Hz芯片的国产突破
  • 瑞芯微RK安卓Android主板GPIO按键配置方法,触觉智能嵌入式开发
  • Dify自定义工作流集成指南:对接阿里云百炼文生图API的实现方案
  • 前端项目配置 Nginx 全攻略
  • 基于开源鸿蒙(OpenHarmony)的【智能家居综合应用】系统
  • 电子电气架构 --- 主机厂电子电气架构演进
  • 物联网通信应用案例之《智慧农业》
  • Java注解的原理
  • AI知识架构之神经网络