yyz notes yyz notes
首页
  • RBAC权限设计
  • 架构图标设计
  • 账号体系
  • python基础
  • python高级
  • python模块
  • python设计模式
  • python数据结构与算法
  • django
  • django-DRF
  • flask
  • 直接设计开源pip包
  • 直接设计开源项目
  • python示例题/脚本
  • python面试题
  • golang基础
  • golang高级
  • golang常用组件
  • gin框架
  • es6
  • javascript
  • react
  • vue
  • TypeScript
  • mysql
  • redis
  • minio
  • elasticsearch
  • mongodb
  • 消息队列
  • 自动化测试
  • 操作系统

    • linux
    • windows
  • nginx
  • docker
  • k8s
  • git
  • ldap
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

益章

可乐鸡翅
首页
  • RBAC权限设计
  • 架构图标设计
  • 账号体系
  • python基础
  • python高级
  • python模块
  • python设计模式
  • python数据结构与算法
  • django
  • django-DRF
  • flask
  • 直接设计开源pip包
  • 直接设计开源项目
  • python示例题/脚本
  • python面试题
  • golang基础
  • golang高级
  • golang常用组件
  • gin框架
  • es6
  • javascript
  • react
  • vue
  • TypeScript
  • mysql
  • redis
  • minio
  • elasticsearch
  • mongodb
  • 消息队列
  • 自动化测试
  • 操作系统

    • linux
    • windows
  • nginx
  • docker
  • k8s
  • git
  • ldap
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • golang基础

    • 初识golang

    • golang基础语法

      • 变量
      • 常量
      • 基本数据类型
      • 复杂数据类型-指针
      • 复杂数据类型-数组array
      • 复杂数据类型-切片slice
      • 复杂数据类型-映射map
      • 复杂数据类型-列表list
        • 介绍
        • _初始化列表_
        • _在列表中插入元素_
          • 提示
        • _从列表中删除元素_
        • _遍历列表——访问列表的每一个元素_
      • nil空值-零值
      • 关键字与标识符
      • 运算符
      • 输入输出
    • golang流程控制

    • golang函数

    • golang内置函数

    • golang包

    • golang错误异常处理

    • golang面向对象(结构体)

    • golang文件处理

    • golang并发编程简介

    • golang并发编程-协程

    • golang网络编程

    • 反射 reflect

  • golang高级

  • 常用组件

  • gin

  • golang
  • golang基础
  • golang基础语法
YiZhang-You
2023-05-23
目录

复杂数据类型-列表list

# 列表list

Go语言list(列表) (opens new window)

# 介绍

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

列表的原理可以这样理解:假设 A、B、C 三个人都有电话号码,如果 A 把号码告诉给 B,B 把号码告诉给 C,这个过程就建立了一个单链表结构,如下图所示。

如果在这个基础上,再从 C 开始将自己的号码告诉给自己所知道号码的主人,这样就形成了双链表结构,如下图所示。

那么如果需要获得所有人的号码,只需要从 A 或者 C 开始,要求他们将自己的号码发出来,然后再通知下一个人如此循环,这样就构成了一个列表遍历的过程。

如果 B 换号码了,他需要通知 A 和 C,将自己的号码移除,这个过程就是列表元素的删除操作,如下图所示。

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

# 初始化列表

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

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

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

package main

import (
	"container/list"
	"fmt"
)

func main() {
	// 列表初始化
	// 一、通过 container/list 包的 New() 函数初始化 list 变量名 := list.New()
	listTest := list.New()
	fmt.Println(listTest)
	// 二、通过 var 关键字声明初始化 list var 变量名 list.List
	var listTest2 list.List
	fmt.Println(listTest2)
}
/*
	&{{0xc00001e1b0 0xc00001e1b0 <nil> <nil>} 0}
	{{<nil> <nil> <nil> <nil>} 0}
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 在列表中插入元素

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

# 提示

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

列表插入元素的方法如下表所示。

package main

import (
	"container/list"
	"fmt"
)

func main() {
	// 列表初始化
	var listTest = list.New()
	listTest.PushBack("fist")
	fmt.Println(listTest)
	listTest.PushFront(67)
	fmt.Println(listTest)
	listTest.InsertAfter(0, listTest.PushBack("fist11"))
	fmt.Println(listTest)
	listTest.InsertBefore(0, listTest.PushBack("fistxx"))
	fmt.Println(listTest)
}

/*
	&{{0xc00008a1b0 0xc00008a1b0 <nil> <nil>} 1}
	&{{0xc00008a210 0xc00008a1b0 <nil> <nil>} 2}
	&{{0xc00008a210 0xc00008a2a0 <nil> <nil>} 4}
	&{{0xc00008a210 0xc00008a300 <nil> <nil>} 6}
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 从列表中删除元素

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

下表中展示了每次操作后列表的实际元素情况。

package main

import (
	"container/list"
	"fmt"
)

func main() {
	l := list.New()
	// 尾部添加
	l.PushBack("canon")
	// 头部添加
	l.PushFront(67)
	// 尾部添加后保存元素句柄
	element := l.PushBack("fist")
	// 在fist之后添加high
	l.InsertAfter("high", element)
	// 在fist之前添加noon
	l.InsertBefore("noon", element)
	for i := l.Front(); i != nil; i = i.Next() {
		fmt.Print(i.Value, "\t")
	}
	fmt.Println()
	// 使用
	l.Remove(element)
	for i := l.Front(); i != nil; i = i.Next() {
		fmt.Print(i.Value, "\t")
	}

}
/*
	67      canon   noon    fist    high
	67      canon   noon    high
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

# 遍历列表——访问列表的每一个元素

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

package main

import (
	"container/list"
	"fmt"
)

func main() {
	l := list.New()
	// 尾部添加
	l.PushBack("canon")
	// 头部添加
	l.PushFront(67)
	for i := l.Front(); i != nil; i = i.Next() {
		fmt.Println(i.Value)
	}
}
/*
	67
	canon
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
编辑 (opens new window)
复杂数据类型-映射map
nil空值-零值

← 复杂数据类型-映射map nil空值-零值→

最近更新
01
配置yun源
05-24
02
linux-配置python虚拟环境
05-24
03
linux文件目录管理
05-24
更多文章>
Theme by Vdoing | Copyright © 2023-2023 yizhang | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式