11.Go 列表

列表是一种非连续的存储容器,由多个节点组成,节点通过一些变量记录彼此之间的关系,列表有多种实现方法,如单链表、双链表等。

在Go语言中,列表使用container/list包来实现,内部的实现原理是双链表,列表能够高效地进行任意位置的元素插入和删除操作。

1、列表的创建

list的初始化有两种方法,分别是使用New()函数和var关键字声明。两种方法的初始化效果是相同的。

  • 通过container/list包的New()函数初始化list,语法:变量名 := list.New()
  • 通过var关键字声明初始化list,语法:var 变量名 list.List

列表与切片和map不同的是,列表并没有具体元素类型的限制,因此,列表的元素可以是任意类型,这既带来了便利,也引来一些问题,例如,给列表中放入了一个interface{}类型的值,取出值后,如果要将interface{}转换为其他类型,将会发生宕机。

2、插入元素

双链表支持从队列前方或后方插入元素,对应的方法分别是PushFront()和PushBack()。

这两种方法都会返回一个*list.Element结构,如果需要删除插入的元素,则只能通过*list.Element配合Remove()方法进行删除,这种方法可以让删除更加高效,同时也是双链表的特性之一。

l := list.New()
l.PushFront("first")
l.PushBack("second")
3、删除元素

列表插入函数的返回值会提供一个*list.Element结构,这个结构记录着列表元素的值及与其他节点之间的关系等信息,从列表中删除元素时,需要用到这个结构进行快速删除。

func main() {
	l := list.New()
	l.PushFront("first ")
	l.PushBack("second ")

	// 尾部添加后保存元素句柄
	element := l.PushBack("third ")
	// 在 third之后添加high
	l.InsertAfter("high ", element)
	// 在 third之前添加low
	l.InsertBefore("low ", element)
	// 删除 element
	l.Remove(element)

	for i := l.Front(); i != nil; i = i.Next() {
		fmt.Print(i.Value) // first second low high
	}
}

4、列表的遍历

遍历双链表需要配合Front()函数获取头元素,遍历时只要元素不为空就可以继续进行,每次遍历都会调用元素的Next()函数,例如:

func main() {
	l := list.New()
	l.PushFront("first ")
	l.PushBack("second ")

	for i := l.Front(); i != nil; i = i.Next() {
		fmt.Print(i.Value) // first second low high
	}
}

  • 使用for语句进行遍历,其中i:=l.Front()表示初始赋值,只会在一开始执行一次,每次循环会进行一次i != nil语句判断,如果返回false,表示退出循环,反之则会执行i = i.Next()。
  • 使用遍历返回的*list.Element的Value成员取得放入列表时的原值。
5、复合数据类型总结

(1)Go语言中切片用来处理数据的集合,映射用来处理具有键值对结构的数据。

(2)内置函数make()可以创建切片和映射,并指定原始的长度和容量。也可以直接使用切片和映射字面量,或者使用字面量作为变量的初始值。切片有容量限制,不过可以使用内置的append()函数扩展容量。映射的增长没有容量或者任何限制。

(3)内置函数len()可以用来获取切片或者映射的长度,内置函数cap()只能用于切片,通过组合,可以创建多维数组和多维切片,也可以使用切片或者其他映射作为映射的值,但是切片不能用作映射的键。将切片或者映射传递给函数的成本很小,并且不会复制底层的数据结构。

相关推荐

  1. Go图片列表

    2023-12-27 12:48:02       32 阅读
  2. Go 数据结构】列表与字典

    2023-12-27 12:48:02       30 阅读
  3. 11-4.Vue2.x基本列表列表更新—push

    2023-12-27 12:48:02       33 阅读
  4. 11-3.Vue2.x基本列表列表排序—sort

    2023-12-27 12:48:02       40 阅读
  5. C++11统一列表初始化,initializer_list

    2023-12-27 12:48:02       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-27 12:48:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-27 12:48:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-27 12:48:02       82 阅读
  4. Python语言-面向对象

    2023-12-27 12:48:02       91 阅读

热门阅读

  1. 在css中如何实现表单验证效果

    2023-12-27 12:48:02       63 阅读
  2. 如何强制 App 在 iOS 后台不断开与融云的长连接?

    2023-12-27 12:48:02       85 阅读
  3. 活动运营常用的ChatGPT通用提示词模板

    2023-12-27 12:48:02       58 阅读
  4. modbus-tcp-rtu协议图表

    2023-12-27 12:48:02       43 阅读
  5. leetcode | go | 第600题 | 不含连续1的非负整数

    2023-12-27 12:48:02       65 阅读
  6. vue中的动态组件和混入

    2023-12-27 12:48:02       51 阅读
  7. 2023年腾讯云活动:2核2G4M轻量服务器3年540元

    2023-12-27 12:48:02       63 阅读
  8. 分布式信号量(Redis)

    2023-12-27 12:48:02       56 阅读
  9. Spring缓存注解@Cacheable、@CachePut、@CacheEvict

    2023-12-27 12:48:02       58 阅读