2019-11-29

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

[toc]

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

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

```go

//[]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>

```go

//string

type = struct string {

    uint8 *str;

    int len;

}

```

## <font size=5>map</font>

```go

//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>

```go

//interface

type = struct runtime.eface {

    runtime._type *_type;

    void *data;

}

```


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

本文来自:简书

感谢作者:

查看原文:2019-11-29

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

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