国外的购物网站有哪些,安徽省住房和城乡建设厅官方网站,网站群建设系统,wordpress在哪里slice
切片是一个引用类型#xff0c;其底层实现是一个结构体#xff0c;包含以下字段#xff1a;
ptr#xff1a;一个指向底层数组的指针#xff0c;指针指向数组的第一个元素。 len#xff1a;切片当前包含的元素数量。 cap#xff1a;切片的容量#xff0c;即底层…slice
切片是一个引用类型其底层实现是一个结构体包含以下字段
ptr一个指向底层数组的指针指针指向数组的第一个元素。 len切片当前包含的元素数量。 cap切片的容量即底层数组从切片的起始位置到底层数组末尾的元素数量。
Map
map 的底层实现是一个哈希表hash table实际上是维护一个数组它通过将键映射到一个固定大小的数组桶中然后在每个桶中存储对应的值。通过哈希函数可以将键转换为数组索引从而快速定位到对应的桶。 如何解决哈希冲突每个桶存储了一个链表或红黑树用于解决哈希冲突多个键映射到同一个桶的情况在哈希表hash table中桶bucket是用于存储键值对的容器。每个桶可以存储一个或多个键值对。
map 的底层数据结构是 hmap 结构体
type hmap struct {count int #表示当前 map 中的键值对数量。flags uint8 #表示一些标志位用于标识 map 的状态和特性。B uint8 #表示桶的数量的对数。B 的值决定了哈希表的大小即桶的数量为 2^B。noverflow uint16 #表示溢出桶的数量即哈希冲突时使用的额外桶的数量hash0 uint32 #表示哈希种子值用于计算键的哈希值buckets unsafe.Pointer #是一个指向桶数组的指针存储了实际的键值对数据oldbuckets unsafe.Pointer #是一个指向旧的桶数组的指针用于扩容时的过渡状态nevacuate uintptr #表示正在迁移的桶的数量即正在从旧桶迁移到新桶的过程中的桶数量extra *mapextra #是一个指向额外信息的指针用于存储一些额外的数据
}map底层如何删除一个键值对
delete(mp, name)从底层角度讲分为以下几个步骤
1根据key计算哈希值找到对应的桶
2在桶中遍历链表或者红黑树找到对应节点
3根据链表or红黑树的规则删除节点
4删除节点后桶中没有其他节点了将桶置为 nil表示该桶为空
5更新 map 的计数器count将键值对的数量减一
懂得了如何删除插入和查询大概流程也是这样插入先检查有无节点有则更新无则插入并且对count查询直接遍历就行
channel
通道底层数据结构是 hchan 结构体
type hchan struct {qcount uint // 当前队列中的元素个数dataqsiz uint // 缓冲区的大小buf unsafe.Pointer // 缓冲区的指针elemsize uint16 // 元素的大小closed uint32 // 通道是否已关闭的标志elemtype *_type // 元素的类型sendx uint // 发送操作的索引recvx uint // 接收操作的索引recvq waitq // 接收操作的等待队列sendq waitq // 发送操作的等待队列lock mutex // 互斥锁
}这里对channel的操作遇到注意几个点 对已经关闭的通道写入报错 对已经关闭的通道读取1若通道有数据数据照样读取出来 2若通道无数据返回通道类型的零值和false
最后学习一项数据结构或者技巧我们不仅仅要掌握如何使用最好要了解他们背后的原理这样可以加深对其的理解