golang Container包解析

本文深入解析了Go语言Container包中的list组件,详细介绍了list的遍历、Element结构体及其操作实现,以及List结构体的初始化过程。Element结构体包含指针和数据存储,而List结构体维护了根节点和长度。初始化时,List的New函数结合内置new分配内存,并通过Init函数完成初始化。此外,还讨论了lazyInit的区别。
摘要由CSDN通过智能技术生成

golang Container包解析

container包 包含了共三种数据结构,即:heap,list,ring

list源码解析

1.遍历list
for e := l.Front(); e != nil; e = e.Next(){
   
  //do something with e.Value
}
2. Element结构体
// Element is an element of a linked list.
type Element struct {
   
	// Next and previous pointers in the doubly-linked list of elements.
	// To simplify the implementation, internally a list l is implemented
	// as a ring, such that &l.root is both the next element of the last
	// list element (l.Back()) and the previous element of the first list
	// element (l.Front()).
	next, prev *Element

	// The list to which this element belongs.
	list *List

	// The value stored with this element.
	Value interface{
   }
}

其中包含三部分

  • 第一部分为结构体指针,指向上下两个关联节点,因而go中的list是一个双向链表

  • 第二部分是一个list指针,表明这个元素是属于哪个链表,因而自定义节点无法随意插入已有链表中

  • 第三部分是数据存储位,存储元素数据,类型为空接口,即泛型。

2.1  Element操作实现

Next和Prev操作简单来说就是首先将节点指向上下节点,此时判断当前节点对应的list字段是否为空或是否是根节点,若不是则有效返回。

3.List结构体

// List represents a doubly linked list.
// The zero value for List is an empty list ready to use.
type List struct {
   
	root Element // sentinel list element, only &root, root.prev, and root.next are used
	len  int     // current list length excluding (this) sentinel element
}
  • root表示根节点元素,len表示长度
3.1 初始化
// Init initializes or clears list l.
func (l *List) Init() *List {
   
	l.root.next = &l.root
	l.root.prev = &l.root
	l.len = 0
	return l
}

通过一个List的指针来调用init函数,首先将其头尾设置为本身,len设为0,并返回该list

// New returns an initialized list.
func New() *List {
    return new(List).Init() }

初始化实际上和New是结合在一起的,list的New函数即通过调用builtin的内建new进行内存分配,创建一个分配zero value的指针,并通过指针调用Init函数完成初始化

// lazyInit lazily initializes a zero List value.
func (l *List) lazyInit()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值