底层实现

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的扩容机制:

  1. 计算新的理论容量和实际所需内存。
  2. 分配新内存。
  3. 将旧的slice的数据复制到新内存。
  4. 返回新的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   //互斥锁
}