详解 Go 语言中 Map 类型和 Slice 类型的传递
作者:mrr 发布时间:2024-05-29 22:07:11
Map 类型
先看例子 m1:
func main() {
m := make(map[int]int)
mdMap(m)
fmt.Println(m)
}
func mdMap(m map[int]int) {
m[1] = 100
m[2] = 200
}
结果是
map[2:200 1:100]
我们再修改如下 m2:
func main() {
var m map[int]int
mdMap(m)
fmt.Println(m)
}
func mdMap(m map[int]int) {
m = make(map[int]int)
m[1] = 100
m[2] = 200
}
发现结果变成了
map[]
要理解这个问题,需要明确在 Go 中不存在引用传递,所有的参数传递都是值传递。
现在再来分析下,如图:
可能有些人会有疑问,为什么途中的 m 像是一个指针呢。查看官方的 Blog 中有写:
Map types are reference types, like pointers or slices, ...
这边说 Map 类型是引用类型,像是指针或是 Slice(切片)。所以我们基本上可以把它当作是指针来看待,只不过这个指针有写特殊罢了。
m1 中,当调用 mdMap 方法时重新开辟了内存,将 m 的内容,也就是 map 的地址拷贝入了 m',所以此时当操作 map 时,m 和 m' 所指向的内存为同一块,就导致 m 的 map 发生了改变。
而在 m2 中,在调用 mdMap 之前,m 并未分配内存,也就是说并未指向任何的 map 内存区域。从未导致 m' 的 map 修改不能反馈到 m 上。
Slice 类型
现在看一下 Slice。
s1:
func main() {
s := make([]int, 2)
mdSlice(s)
fmt.Println(s)
}
func mdSlice(s []int) {
s[0] = 1
s[1] = 2
}
s2:
func main() {
var s []int
mdSlice(s)
fmt.Println(s)
}
func mdSlice(s []int) {
s = make([]int, 2)
s[0] = 1
s[1] = 2
}
不出所料:
s1 结果为
[1 2]
s2 为
[]
因为正如官方所说,Slice 类型与 Map 类型一样,类似于指针,这也是为什么这两种类型从来不需要用 * 进行修饰的原因。
修改一下 s1,变成 s3:
func main() {
s := make([]int, 2)
mdSlice(s)
fmt.Println(s)
}
func mdSlice(s []int) {
s = append(s, 1)
s = append(s, 2)
}
不再修改 slice 原先的两个元素,而加上另外两个,结果为:
[0 0]
发现修改并没有反馈到原先的 slice 上。
这里我们需要把 slice 想象为特殊的指针,其已经保存了所指向内存区域长度,所以 append 之后的内存并不会反映到 main() 中:
Chan 类型
Go 中 make 函数能创建的数据类型就 3 类:Slice, Map, Chan。不比多说,相比读者已经能想象 Chan 类型的内存模型了。的确如此,读者可以自己尝试,这边就不过多赘述了。(可以通通过 == nil 的比较来进行测试)。
总结
以上所述是小编给大家介绍的详解 Go 语言中 Map 类型和 Slice 类型的传递网站的支持!
猜你喜欢
- 1.首先在pycharm上使用pip安装pip install html-table pip install jira2.初始化发件人邮箱,
- session请求过程当第一次访问网站时,Seesion_start()函数就会创建一个唯一的Session ID,并自动通过HTTP的响应
- Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列。1)
- 1:为什么我得不到变量 我在一网页向另一网页POST数据name,为什么输出$name时却得不到任何值? 在PHP4.2以后的版本中regi
- matplotlib简介如果你在大学里参加过数学建模竞赛或者是用过MATLAB的话,相比会对这一款软件中的画图功能印象深刻。MATLAB可以
- 背景公司一个golang的项目,使用到了公司的私有仓库,去执行go mod tidy(下载依赖)的时候,到download公司私有库的时候就
- 分享炫酷的前端页面随机二维码验证,供大家参考,具体内容如下直接上代码<%@ page contentType="text/h
- 前言我们在django-rest-framework 自定义swagger 文章中编写了接口, 调通了接口文档. 接口文档可以直接填写参数进
- Celery (芹菜)是基于Python开发的分布式任务队列。它支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度。架
- 数据类型:定义列中可以存储什么数据以及该数据实际怎样存储的基本规则。数据类型用于以下目的:1、允许限制可存储在列中的数据。如:数值数据类型列
- <script type="text/javascript">一、获取url所有参数值function US
- 简单说明,代码太难懂,先做此记录留待来日在看步骤:1,pip install pyzbar安装好该模块。pyzbar模块是Python一个开
- Msg 102, Level 15, State 1, Line 3 Incorrect syntax near '+'.
- 前言本文主要给大家介绍了关于Python中序列的修改、散列与切片的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
- js关于 byval 与 byref 二者区别: byval 传递数值,实参和形参分处不同的内存单元,互不干扰! byref 传递地址,实参
- 说起页面执行时间相信大家并不陌生,如果你经常逛论坛,就会发现很多论坛底部都显示有页面执行时间,那么什么是页面执行时间呢?我个人理解是一个网页
- 本文实例为大家分享了使用python3制作的表白神器,供大家参考,具体内容如下使用python3制作的小玩意,哪里需要改造的,望各位评论一下
- #include <string>#include <iostream>using namespace std; v
- 我们打开Google的时候可能大家会发现,无论你输入Google的任何网址,它都根据你使用的语言自动判断并跳转到不同的语言界面。也就是你用不
- Mysql环境变量配置mysql的环境变量配置步骤1.1、在桌面选择“计算机”的图标,右键&