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

相关文章:

  • 内存泄漏问题分享
  • nginx 配置https
  • 怎样免费部署LLM通过python进行调用
  • [含文档+PPT+源码等]精品基于Python实现的居家健身系统的设计与实现
  • Linux | GRUB / bootloader 详解
  • 【Java项目】基于Spring Boot的论坛管理系统
  • 如何在 Unity3D 中将网页内容渲染为纹理
  • 缓存击穿、缓存穿透、缓存雪崩
  • 回归预测 | Matlab基于SSA-BiLSTM-Attention的数据多变量回归预测(多输入单输出)
  • 文献汇总|AI生成图像检测相关数据集汇总
  • 聚焦低空经济,峰飞航空飞行汽车开启未来出行新篇章
  • 学习笔记06——JVM调优
  • 【论文解读】Kimi开源《Muon is Scalable for LLM Training》
  • 蓝桥杯练习代码
  • 【Python爬虫(88)】当Python爬虫邂逅智能硬件:解锁数据新玩法
  • 【K8S】Kubernetes 基本架构、节点类型及运行流程详解(附架构图及流程图)
  • 仅需三分钟,使用Vue3.x版本组件式风格实现一个消息提示组件!
  • 故障诊断 | Matlab实现基于双堆集stack模型的多特征分类预测/故障诊断
  • 【大模型系列篇】大模型微调工具 LLama-Factory、Unsloth、ms-SWIFT
  • 本地部署阿里的万象2.1文生视频(Wan2.1-T2V-1.3B)模型
  • “拼好假”的年轻人,今年有哪些旅游新玩法?
  • 雷军:过去一个多月是创办小米以来最艰难的时间
  • 上财发布“AI+课程体系”,人工智能如何赋能财经教育?
  • 习近平会见塞尔维亚总统武契奇
  • 比特币价格重返10万美元,哪些因素使然?
  • 陕西永寿4岁女童被蜜蜂蜇伤致死,当地镇政府介入处理