Go 语言 list (列表)_初始化_遍历_删除

更新时间 2022-03-31 14:58:04

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第2个项目《仿小红书(微服务架构)》正在更新中。第1个项目:全栈前后端分离博客项目已经完结,演示地址:http://116.62.199.48/。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 255 小节,累计 39w+ 字,讲解图:1716 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1300+ 小伙伴加入,欢迎点击围观

列表 (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

图示:

go语言遍历list列表代码示例go语言遍历list列表代码示例