Golang常见数据类型底层介绍
- 切片(slice)
本质:结构体 内容: - 指向数组头地址的指针(即数组首个元素的内存地址)。 - 长度,存放元素数量。 - 容量,底层数组的长度。 数据结构:数组
- 映射(map)
本质:结构体 内容: - 键值对数量 - 桶数组长度以2为底数的对数 - 指向当前使用桶数组的指针 - 指向旧桶数组的指针 - 哈希种子 数据结构: 含特化桶的哈希表。 特化桶介绍: 含key数组、value数组、tophash数组、溢出桶指针。key查找时,通过tophash初步筛选,再比对出目标key。桶溢出后创建溢出桶,通过链表结构连接。 存旧桶数组指针目的:渐进式完成扩容,通过插入和删除操作,逐步将数据迁移到新桶数组,所有数据完成迁移,才会回收旧桶数组。
- 通道(chan)
本质:结构体 内容: - 指向环形缓冲区的指针,无缓冲区通道则存nil - 环形缓冲区元素数量 - 环形缓冲区的容量 - 等待发送队列,存goroutine信息 - 等待接收队列,存goroutine信息 - 互斥锁,所有通道操作都必须先索取锁。 - 待发送元素索引 - 待接收元素索引 - 关闭标识 数据结构:队列 环形缓冲区介绍:本质是数组,通过发送或接收元素的索引与数组长度比对,判断要不要回到数组头。所以表现出来是环形的。
浙公网安备 33010602011771号