企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
列表是一种非连续的存储容器,由多个节点组成,节点通过一些变量记录彼此之间的关系,列表有多种实现方法,如单链表、双链表等。 ## 初始化列表 list的初始化有两种方法:两种方法的初始化效果都是一致的。 * 使用New()函数:通过container/list包中的New()函数初始化list 变量名 := list.New() * var关键字声明 var 变量名 list.List 列表与切片和map不同的是,列表没有具体元素类型的限制,因此,列表的元素可以是任意类型,这既带来了便利,也引来了一些问题,例如给列表中放入一个interface{}类型的值,取出值后,若要将interface{}转换为其他类型将会发生宕机。 ## 在列表中插入元素 双链表支持从队列前方或后方插入元素,分别对应的方法是PushFront和PushBack。 提示: 这两个方法都会返回一个*list.Element结构,若在以后的使用中需要删除插入的元素,则只能通过*list.Element配置Remove()方法进行删除,这种方法可以让删除更加效率化。同时也是双链表特性之一。 | 方法 | 功能 | | --- | --- | | PushFront(v interface{}) *Element | 在链表的前方插入元素 | | PushBack(v interface{}) *Element | 在链表的后方插入元素 | | InsertBefore(v interface{}, mark *Element) *Element | 在mark点之前插入元素,mark点由其他插入函数提供 | | InsertAfter(v interface{}, mark *Element) *Element | 在mark点之后插入元素,mark点由其他插入函数提供 | | PushFrontList(other *list) | 添加other列表元素到头部 | | PushBackList(other *list) | 添加other列表元素到尾部 | ## 列表中删除元素 列表插入函数的返回值会提供一个*list.Element结构,这个结构记录着列表元素的值以及其他节点之间的关系等信息,从列表中删除元素时,需要用到这个结构进行快速删除。 ``` package main import "container/list" func main() { l := list.New() // 尾部添加 l.PushBack("canon") // 头部添加 l.PushFront(67) // 尾部添加之后保存元素句柄 element := l.PushBack("first") // 在first之后添加high l.InsertAfter("high", element) // 在first之前添加noon l.InsertBefore("noon", element) // 删除 l.Remove(element) } ``` ## 遍历列表,访问列表的每一个元素 遍历双链表需要配置Front()函数获取头元素,遍历时只要元素不为空就可以继续进行,每次遍历都会调用元素的Next()函数,代码如下: ``` package main import ( "container/list" "fmt" ) func main() { l := list.New() // 尾部添加 l.PushBack("canon") // 头部添加 l.PushFront(67) for item := l.Front(); item != nill; item = item.Next() { fmt.Println(item.Value) } } ```