Go 语言 list (列表)_初始化_遍历_删除
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
截止目前, 星球 内专栏累计输出 66w+ 字,讲解图 2896+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2300+ 小伙伴加入学习 ,欢迎点击围观
列表 (list) 是一种非连续存储的容器,又多个节点组成,节点通过一些变量将彼此串联起来。列表(list)底层常见的数据结构有: 单链表、双链表等
在 Go 语言 中,列表的实现都在 container/list
包中,内部实现原理是双链表。
列表(list)能够方便高效地进行元素的删除、插入操作。
一、初始化 list (列表)
list 的初始化方法有两种:New 和 声明。两者的效果是一样的.
1.1 通过 container/list 包中的 New 方法来初始化 list
格式如下:
变量名 := list.New()
1.2 通过声明初始化 list
格式如下:
var 变量名 = list.List
PS: 列表和 map (字典) 有什么区别?
相比较 map (字典),列表没有具体元素类型的限制,也就是说,你可以添加任意类型到 list 容器中,如字符串 、整型 等。这带来了一些便利,但是也存在一些问题:给一个列表添加了非期望类型的值后,在取值时,将 interface{} 转换为期望类型时会发生宕机。
二、向 list (列表) 中添加元素
双链表支持往队列前面或后面添加元素,对应的方法分别是:
PushFront
PushBack
示例代码如下:
l := list.New()
l.PushFront("犬小哈教程")
l.PushBack("www.quanxiaoha.com")
关于 list (列表) 插入元素的方法,如下表所示:
方法 | 功能 |
---|---|
InsertAfter(v interface{}, mark *Element) *Element | 在 mark 点后面插入元素 |
InsertBefore(v interface{}, mark *Element) *Element | 在 mark 点前面插入元素 |
PushFrontList(other *List) | 添加 other 列表中的元素到头部 |
PushBackList(other *List) | 添加 other 列表中的元素到尾部 |
三、从 list (列表) 中删除元素
list (列表) 的插入函数的返回值是一个 *list.Element
结构,通过它来完成对列表元素的删除:
package main
import (
"container/list"
)
func main() {
l := list.New()
// 头部添加字符串
l.PushFront("犬小哈教程")
// 尾部添加字符串
l.PushBack("www.quanxiaoha.com")
// 尾部添加一个整型,并保持元素句柄
element := l.PushBack(1)
// 在 1 之后添加字符串 2
l.InsertAfter("2", element)
// 在 1 之前添加字符串 0
l.InsertBefore("0", element)
// 删除 element 对应的元素
l.Remove(element)
}
最终队列中保存的元素有:
犬小哈教程 www.quanxiaoha.com 0 2
四、遍历 list (列表)
遍历 list (列表) 需要搭配 Front()
函数获取头元素,遍历过程中,只要元素不为空则可继续调用 Next
函数往下遍历:
package main
import (
"container/list"
"fmt"
)
func main() {
l := list.New()
// 头部添加字符串
l.PushFront("犬小哈教程")
// 尾部添加字符串
l.PushBack("www.quanxiaoha.com")
// 遍历
for i := l.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}
}
注意,在 for 语句遍历中:
- 其中
i := l.Front()
表示初始赋值,用来获取列表的头部下标; - 然后每次会循环会判断
i != nil
,若等于空,则会退出循环,否则执行i.Next()
继续循环下一个元素;
代码输出如下:
犬小哈教程
www.quanxiaoha.com
图示: