内置类型的底层数据结构

· · 730 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

[toc]

<font size=6>golang内置类型的底层数据结构

<font size=5>slice切片 </font>

//[]int16
type = struct []int16 {
    int16 *array;
    int len;
    int cap;

//[]byte
type = struct []uint8 {
    uint8 *array;
    int len;
    int cap;
}
  • slice中 array 是一个指针,它指向的是一个Array
  • len 代表的是这个slice中的元素长度
  • cap 是slice的容量

<font size=4>特性</font>

slice的Array存储在连续内存上:

  1. 随机访问很快,适合用下标访问,缓存命中率会高。
  2. 动态扩容时会涉及到内存拷贝和开辟新内存,会带来gc压力、内存碎片化。
  3. 如果知道所需空间,提前分配cap是很好的。
  4. 新、老 slice 共用底层数组,对底层数组的更改都会影响到彼此。
  5. append可以掰断新老slice共用底层数组的关系。(不理解?可以参考扩容原理)

<font size=5>string字符串</font>

//string
type = struct string {
    uint8 *str;
    int len;
}

<font size=5>map</font>

//map[int16]byte
type = struct hash<int16, uint8> {
    int count;
    uint8 flags;
    uint8 B;
    uint16 noverflow;
    uint32 hash0;
    struct bucket<int16, uint8> *buckets;
    struct bucket<int16, uint8> *oldbuckets;
    uintptr nevacuate;
    runtime.mapextra *extra;
} *

<font size=5>interface接口类型</font>

//interface
type = struct runtime.eface {
    runtime._type *_type;
    void *data;
}


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:

查看原文:内置类型的底层数据结构

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

730 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传