设为首页 加入收藏

TOP

关于 Go 中 Map 类型和 Slice 类型的传递
2017-11-13 14:55:34 】 浏览:15
Tags:关于 Map 类型 Slice 传递

先看例子 m1:


结果是


我们再修改如下 m2:


发现结果变成了


要理解这个问题,需要明确在 Go 中不存在引用传递,所有的参数传递都是值传递。


现在再来分析下,如图:



可能有些人会有疑问,为什么途中的 m 像是一个指针呢。查看官方的 Blog 中有写:


这边说 Map 类型是引用类型,像是指针或是 Slice(切片)。所以我们基本上可以把它当作是指针来看待(注意,只是近似,或者说其中含有指针,其内部仍然含有其他信息,这里只是为了便于理解),只不过这个指针有些特殊罢了。


m1 中,当调用 mdMap 方法时重新开辟了内存,将 m 的内容,也就是 map 的地址拷贝入了 m',所以此时当操作 map 时,m 和 m' 所指向的内存为同一块,就导致 m 的 map 发生了改变。


而在 m2 中,在调用 mdMap 之前,m 并未分配内存,也就是说并未指向任何的 map 内存区域。从未导致 m' 的 map 修改不能反馈到 m 上。


现在看一下 Slice。


s1:


s2:


不出所料:


s1 结果为


s2 为


因为正如官方所说,Slice 类型与 Map 类型一样,类似于指针,Slice 中仍然含有长度等信息。


修改一下 s1,变成 s3:


不再修改 slice 原先的两个元素,而加上另外两个,结果为:


发现修改并没有反馈到原先的 slice 上。


这里我们需要把 slice 想象为特殊的指针,其已经保存了所指向内存区域长度,所以 append 之后的内存并不会反映到 main() 中:



那如何才能反映到 main() 中呢?没错,使用指向 Slice 的指针。


内存如图所示:



Go 中 make 函数能创建的数据类型就 3 类:Slice, Map, Chan。不比多说,相比读者已经能想象 Chan 类型的内存模型了。的确如此,读者可以自己尝试,这边就不过多赘述了。(可以通通过 == nil 的比较来进行测试)。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇gops - Go语言程序查看和诊断工具 下一篇Go 程序的性能优化及 pprof 的使用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

最新文章

热门文章

C 语言

C++基础

windows编程基础

linux编程基础

C/C++面试题目