Go Map 学习

首先感谢这篇文章:https://i6448038.github.io/2018/08/26/map-secret/ 。让我从源码层面上大致了解了 Map 的结构。 先看一段代码运行结果:

当时因为这个特性导致了对 Map 的并发读写,解决了很久,记录一下。

参考了开头那篇文章,想从 Go 源码结构上进行调试。

配置

VsCode 添加一个 gdb 的调试:
再在项目目录添加一个 .gdbinit 来加载 gdb 解析:
指定 runtime 下的 runtime-gdb.py,完成配置。

调试结果

首先,Go 的函数传参都是值传递。 写一段简单代码测试一下,看一下他们两个变量的值:
传递参数:
两个变量值都是一个指针,指向同一个地址。 Go 中 map 是引用类型,值是一个指针指向真实值的结构地址,即文章中的 hmap 结构。 通过在生成 map 时步入,可以看到实例代码中生成 map 的代码:
返回一个 *hmap 的指针。证实了上面所说的 map 结构。 上述代码 testMap 函数在传递给形参 m 时,复制一份值传递给 m,即 m 的值也是指向相同地址,造成了上面的现象。

最后将 map 改成 struct,来解决了我变量共享的问题。