Golang 基本类型存储方式

Posted by Wang Gang on 2019-08-21

结构体

结构体数据的对象是连续内存

字符串存储方式

1.字符串两个字节,一个是内容的指针,一个字符串的长度
2.字符串在切割时没有改变内容,仅仅改变了内容的指针和子串的长度

切片

1.包含三个部分(内容指针,长度,容量)
2.切割内容时和string切割相同,都是新建一个数据结构

3.扩容:
* 1.如果新的大小是当前大小2倍以上,则大小增长为新大小
* 2.否则循环以下操作:如果当前大小小于1024,按每次2倍增长,否则每次按当前大小1/4增长。直到增长的大小超过或等于新大小。
* 3.扩容在后面追加申请内存,如果内存不够长,则重新申请内存,重新复制

4.new 和 make

5.申请内存使用

1
2
3
4
5
var o []byte
sliceHeader := (*reflect.SliceHeader)((unsafe.Pointer(&o)))
sliceHeader.Cap = length
sliceHeader.Len = length
sliceHeader.Data = uintptr(ptr)

map

2内部使用hash table实现

  • 计算key
  • 写入内存

3扩容情况
* 新建数据结构,写入时如果在新的数据结构没有找到,则在老的数据中寻找,找到后写入到新的数据结构中
ps:初始化的时候定义长度,可以减伤扩容的系统消耗

内容原文请参照:https://tiancaiamao.gitbooks.io/go-internals/content/zh/02.1.html