想知道go的数据类型在内存中是怎么分布的,一个有趣的了解方式,那就是panic
1 | package main |
如上代码运行,两次函数中的panic打印中函数调用的栈信息
从中我们关注函数参数部分(注意panic限制展示参数10个,超过不显示)
main.retFunc(0x9edcf, 0x1, 0x1042ff9c, 0x3, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
和函数声明个数不一致retFunc(s string, sl []rune, it interface{}, a AA) int
这里我们可以减少函数参数类型,一个个去试,对应数据类型的内存分布就都能发现了
这里直接看结果
- map 有一个域
- string 有两个域 (一个指向字符串数据的指针和一个长度)
- slice 有三个域 (一个指向底层数组的指针,一个长度,一个容量)
- interface 有两个域 (一个指向类型的指针和一个指向值的指针)
- struct 按其每个field的内存分布依次排列
所以上边retFunc的panic中
1 | main.retFunc( |
如有疑问,请文末留言交流或邮件:newbvirgil@gmail.com 本文链接 : https://newbmiao.github.io/2018/03/15/go-value-layout-in-memory.html