网站首页 > 博客文章 正文
三年前就说要学习Go语言。一直没有系统学习下去,学习几天就断几月又想起来,没有延续性。最近在反思自己,为什么不能坚持!
想想每天都在看头条各种新闻、技术文章等,是否把学习经历发布于此会督促我学习下去
发布于此是为了督促自己坚持学习下去,希望和大家共同进步。谢谢!
在Go语言中,列表使用 container/list 包来实现,内部的实现原理是双链表,列表能够高效地进行任意位置的元素插入和删除操作。
初始化列表
list 的初始化有两种方法:分别是使用 New() 函数和 var 关键字声明,两种方法的初始化效果都是一致的。
1) 通过 container/list 包的 New() 函数初始化 list
变量名 := list.New()
2) 通过 var 关键字声明初始化 list
var 变量名 list.List
列表与切片和 map 不同的是,列表并没有具体元素类型的限制,因此,列表的元素可以是任意类型,这既带来了便利,也引来一些问题,例如给列表中放入了一个 interface{} 类型的值,取出值后,如果要将 interface{} 转换为其他类型将会发生宕机。
在列表中插入元素
双链表支持从队列前方或后方插入元素,分别对应的方法是 PushFront 和 PushBack。
提示
这两个方法都会返回一个 *list.Element 结构,如果在以后的使用中需要删除插入的元素,则只能通过 *list.Element 配合 Remove() 方法进行删除,这种方法可以让删除更加效率化,同时也是双链表特性之一。
下面代码展示如何给 list 添加元素:
//创建一个列表实例。
l := list.New()
//将 fist 字符串插入到列表的尾部,此时列表是空的,插入后只有一个元素。
l.PushBack("fist")
//将数值 67 放入列表,此时,列表中已经存在 fist 元素,67 这个元素将被放在 fist 的前面。
l.PushFront(67)
列表插入元素的方法如下表所示。
从列表中删除元素
列表插入函数的返回值会提供一个 *list.Element 结构,这个结构记录着列表元素的值以及与其他节点之间的关系等信息,从列表中删除元素时,需要用到这个结构进行快速删除。
列表操作元素:
package main
import "container/list"
func main() {
// 创建列表实例。
l := list.New()
// 将字符串 canon 插入到列表的尾部。
l.PushBack("canon")
// 将数值 67 添加到列表的头部。
l.PushFront(67)
// 尾部添加后保存元素句柄
// 将字符串 fist 插入到列表的尾部,并将这个元素的内部结构保存到 element 变量中。
element := l.PushBack("fist")
// 在fist之后添加high
l.InsertAfter("high", element)
// 在fist之前添加noon
l.InsertBefore("noon", element)
// 移除 element 变量对应的元素。
l.Remove(element)
}
下表中展示了每次操作后列表的实际元素情况。
遍历列表——访问列表的每一个元素
遍历双链表需要配合 Front() 函数获取头元素,遍历时只要元素不为空就可以继续进行,每一次遍历都会调用元素的 Next() 函数,代码如下所示。
//创建一个列表实例。
l := list.New()
// 尾部添加
l.PushBack("canon")
// 头部添加
l.PushFront(67)
//使用 for 语句进行遍历,其中 i:=l.Front() 表示初始赋值,只会在一开始执行一次,每次循环会进行一次 i != nil 语句判断,如果返回 false,表示退出循环,反之则会执行 i = i.Next()。
for i := l.Front(); i != nil; i = i.Next() {
//使用遍历返回的 *list.Element 的 Value 成员取得放入列表时的原值。
fmt.Println(i.Value)
}
代码输出如下:
67
canon
猜你喜欢
- 2025-03-06 Alist网盘添加教程,挂载Alist作为本地硬盘使用,简直太香了
- 2025-03-06 Redis中的List,底层采用了什么数据结构?
- 2025-03-06 有没有给文档批量添加内容方法?有的,当然有的。就三步!
- 2025-03-06 不会用list的程序员不是好程序员,C++标准容器list类实例详解
- 2025-03-06 VBA高级应用30例应用3在Excel中的ListObject对象:插入行和列
- 2025-03-06 Python列表(List)一文全掌握:核心知识点+20实战练习题
- 2025-03-06 如何更优雅的往List中添加数据
- 2025-03-06 list列表基本操作
你 发表评论:
欢迎- 05-21上传图片到cloudflare r2
- 05-21wordpress通过代码实现百度主动推送和实时推送
- 05-21百度实时推送代码解决方案
- 05-21Elasticsearch的路由routing的应用技巧
- 05-21技巧:PHP版本怎样隐藏在Linux服务器
- 05-21Python 进阶-day24: API 开发
- 05-21kubectl常用删除命令
- 05-21HTTP 的常见头字段有哪些?说说它们的作用
- 376℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 371℃用AI Agent治理微服务的复杂性问题|QCon
- 364℃初次使用IntelliJ IDEA新建Maven项目
- 356℃Maven技术方案最全手册(mavena)
- 353℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 351℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 351℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 346℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)