底层实现
Map
底层是一种哈希表实现,它的底层结构由runtime/map.go中的hmap结构体。
type hamp struct{
count int //元素个数
flags uint8 //状态标志
B uint8 //桶数量的对数
noverflow uint16 //溢出桶的大致数量
hash0 uint32 //哈希种子
buckets unsafe.Pointer //指向2^B个桶的数组
oldbuckets unsafe.Pointer //扩容时,指向旧的桶
nevacuate uintptr //扩容时,已经迁移的桶进度技术
extra *mapextra //可选字段
}
Slice
底层由runtime/slice.go的slice结构体定义,包含一个指向底层数组的指针,和切片长度和切片容量。
type slice struct{
array unsafe.Pointer
len int
cap int
}
多个切片可以共享同一个底层数组。append函数会触发slice的扩容机制:
- 计算新的理论容量和实际所需内存。
- 分配新内存。
- 将旧的slice的数据复制到新内存。
- 返回新的slice结构。(新的指针、长度和容量)
Channel
底层由runtime/chan.go的hchan结构体定义,主要包含一个环形缓冲区、两个等待队列、一个互斥锁和一些元数据信息。
type hchan struct{
qcount uint //队列元素数量
dataqsiz uint //环形队列大小
buf unsafe.Pointer //指向环形队列的指针
elemsize uint16 //元素大小
closed uin32 //是否已经关闭
elemtype *_type //元素类型
sendx uint //发送操作处理到的位置
recvx uint //接收操作处理到的位置
recvq waitq //等待接收的groutine队列
sendq waitq //等待发送的groutine队列
lock mutex //互斥锁
}