Go中slice和map引用传递误区

news/2025/2/27 9:11:53

背景

关于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.niftyadmin.cn/n/5869854.html

相关文章

【Linux】调试工具GDB的使用及案例讲解

Linux系列 文章目录 Linux系列前言一、gdb的使用背景二、gdb的使用总结 本篇主要针对小白讲解,可以很多地方比较咯嗦 前言 GDB是Linux下一款强大的调试工具。GDB可以调试C、C、Java等语言,对于在Linux下工作的程序员来说,GDB是必不可少的调试…

数据存储:一文掌握存储数据到MongoDB详解

文章目录 一、环境准备1.1 安装MongoDB1.2 安装Python MongoDB驱动 二、连接到MongoDB2.1 基本连接2.2 连接到MongoDB Atlas(云服务) 三、基本CRUD操作3.1 创建(Create):插入数据3.2 读取(Read)…

【学习方法】学习软件专业课程的思考方式

学习软件专业课程的思考方式 在学习软件专业课程时,我们往往会遇到一些看似简单但实际上却非常复杂的概念和理论。这种时候,我们可能会觉得书本很厚,难以理解。然而,这种看似简单的想法并不一定就是错误的,因为它激发…

去中心化技术P2P框架

中心化网络与去中心化网络 1. 中心化网络 在传统的中心化网络中,所有客户端都通过一个中心服务器进行通信。这种网络拓扑结构通常是一个星型结构,其中服务器作为中心节点,每个客户端只能与服务器通信。如果客户端之间需要通信,必须…

ElasticSearch 是如何实现分布式的?

ElasticSearch 是如何实现分布式的? 如果你正在准备技术面试,或者想深入理解 ElasticSearch(简称 ES)是如何实现分布式的,这篇文章将用通俗易懂的方式来讲解。 1. 为什么需要分布式搜索? 在互联网行业&a…

【Python爬虫(80)】当Python爬虫邂逅边缘计算:探索数据采集新境界

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取&#xff…

AWS S3 如何设置公开访问权限?

1.让整个bucket都有公开访问权限 1.1关闭【阻止公共读】 1.2关闭ACL访问控制 1.3打开桶策略 这样桶内所有的图片就能访问了 2.只开放特定文件让其具有访问权限? 2.1关闭【阻止公共读】 如之前的图示 2.2打开ACL控制 2.3单个文件打开公共读

SOC-ATF 安全启动BL31流程分析(3)

一、BL31启动流程 与bl1和bl2不同,bl31包含两部分功能,在启动时作为启动流程的一部分,执行软硬件初始化以及启动bl32和bl33镜像。在系统启动完成后,将继续驻留于系统中,并处理来自其它异常等级的smc异常,以…