Go list的介绍与使用
介绍
Go的list是一个双向链表,链表可以高效的删除插入元素,很多场景是需要用到这个结构的,比如cache
使用
list
在包container/list
下,可以通过NeW()
初始化或者var
声明
两种方法如下
mylist := list.New()
var mylist list.List
-
常用的函数以及功能如下表格
| 函数|功能 |
| :------------ | :------------ |
|PushFront(v any) *Element
|在最前插入元素 |
|PushBack(v any) *Element
|在最后插入元素 |
|InsertBefore(v any, mark *Element) *Element
|将元素插到mark前 |
|InsertAfter(v any, mark *Element) *Element
|将元素插到mark后 |
|MoveToFront(e *Element)
|将指定元素移到最前|
|MoveToBack(e *Element)
|将指定元素移到最后|
|MoveBefore(e, mark *Element)
|将指定元素移到mark前|
|MoveAfter(e, mark *Element)
|将指定元素移到mark后|
|PushBackList(other *List)
|将另一个list插入到当前list后 |
|PushFrontList(other *List)
|将另一个list插入到当前list前|
|Remove(e *Element) any
|删除指定元素|
|Len()
|返回list长度| -
demo
package main
import (
"container/list"
"fmt"
)
func main() {
mylist := list.New()
one := mylist.PushFront("first")
two := mylist.PushBack("second")
head := mylist.InsertAfter("third", one)
three := mylist.InsertAfter(4, two)
mylist.Remove(three)
mylist.MoveToFront(head)
for e := mylist.Front(); e != nil; e = e.Next() {
fmt.Printf("%v ", e.Value)//third first second
}
}
list 当堆队列用
package main
import (
"container/list"
"fmt"
)
func main() {
//q := list.List{}
// 堆
q := list.New()
q.PushBack(1)
q.PushBack(2)
q.PushBack(3)
q.PushBack(4)
for q.Len() > 0 {
cur := q.Back().Value.(int) // 类型转换,方便后续操作
q.Remove(q.Back())
// 下面这样写更简介些,少些一行
//cur := q.Remove(q.Back()).(int)
fmt.Println(cur) // 4 3 2 1
}
q.PushBack(1)
q.PushBack(2)
q.PushBack(3)
q.PushBack(4)
for q.Len() > 0 {
//cur := q.Back().Value.(int) // 类型转换,方便后续操作
//q.Remove(q.Back())
// 下面这样写更简介些,少些一行
//通过q.Back q.Front q.PushBack q.PushFront , 即刻实现双端队列
cur := q.Remove(q.Front()).(int)
fmt.Println(cur) // 1 2 3 4
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析