当前位置: 首页 > news >正文

深入解析Go语言的容器包

在Go语言中,container标准包为开发者提供了三个非常有用的数据结构:堆(heap)、链表(list)和环(ring)。这些数据结构的实现分别位于container/heapcontainer/listcontainer/ring中。理解这些数据结构以及它们的实现方式,可以帮助我们更高效地处理各种复杂的数据存储和操作任务。

环形链表简介

环(ring)是一种特殊的链表,它的最后一个元素指向第一个元素,这意味着它没有明确的起点和终点。环形链表中的每个节点在逻辑上是等价的,可以从任何一个节点开始遍历整个环。通过这种结构,我们可以方便地循环遍历数据。

链表的应用

环形链表在许多实际应用中非常有用。例如,假设你有一组固定大小的数据,想要在这组数据之间不停循环操作,环形链表能够避免重新初始化数据的开销。此外,环形链表在某些游戏循环、操作系统调度器等需要循环处理任务的场景中非常常见。

开始使用container/ring

接下来,我们将通过代码示例来介绍如何使用container/ring包。在此之前,先简单解释一下它的基本操作。container/ring包提供了少量函数,其中最重要的就是Next()Do()Next()函数用于获取当前节点的下一个节点,Do()函数则用于对环中的每个节点执行指定操作。

示例代码:创建环形链表

首先,我们定义一个环形链表的大小,并使用ring.New()来初始化一个环:

package mainimport ("container/ring""fmt"
)var size int = 10  // 环的大小func main() {myRing := ring.New(size + 1) // 创建一个大小为size+1的环fmt.Println("空环:", *myRing)// 给环形链表的每个节点赋值for i := 0; i < myRing.Len()-1; i++ {myRing.Value = imyRing = myRing.Next()}myRing.Value = 2  // 在最后一个节点赋值
}

在这个代码段中,我们首先创建了一个大小为size+1的环。然后,通过一个for循环为环中的每个节点赋值。在最后一步,我们手动将最后一个节点的值设置为2,尽管该值在循环中已经出现过。

使用Do()函数遍历环

我们可以使用ring.Do()来遍历环中的每个节点,并对节点值进行操作。下面的代码将遍历环中的每个节点,并计算节点值的总和:

sum := 0
myRing.Do(func(x interface{}) {t := x.(int)  // 类型断言,确保节点的值是整数sum += t      // 累加每个节点的值
})
fmt.Println("总和:", sum)

ring.Do()是一个非常简洁的遍历方式,它通过传入一个函数,依次处理环中的每个元素。如果你不修改环中的结构,Do()函数可以安全使用,且代码更加简洁。

使用Next()函数遍历环

虽然Do()是遍历环的简洁方式,但你也可以通过Next()函数手动遍历环:

for i := 0; i < myRing.Len()+2; i++ {myRing = myRing.Next()  // 获取下一个节点fmt.Print(myRing.Value, " ")
}
fmt.Println()

在这个例子中,我们使用Next()函数遍历了环,并输出了每个节点的值。需要注意的是,由于环没有明确的终点,调用Next()可以无限次循环,因此我们通过Len()函数来控制循环次数。

执行结果

当你运行上面的代码时,输出可能类似如下:

空环: {0xc00000a080 0xc00000a1a0 <nil>}
总和: 45
0 1 2 3 4 5 6 7 8 9 2 0 1

可以看到,环中可以包含重复值,并且遍历过程中,环会不断循环下去,除非我们人为设定结束条件。


使用container/list实现链表

与环形链表不同,链表(list)是一种线性数据结构,每个节点指向下一个节点。在Go的container/list包中,实现了一个双向链表(doubly linked list),既可以从头遍历到尾,也可以从尾遍历到头。双向链表的优点是我们可以方便地插入和删除元素。

链表的基本操作

container/list包提供了链表的基本操作,比如插入、删除、遍历等。下面我们通过一个完整的例子,来演示如何使用这些操作。

示例代码:链表的创建与操作
package mainimport ("container/list""fmt""strconv"
)func printList(l *list.List) {// 从尾部向头部遍历for t := l.Back(); t != nil; t = t.Prev() {fmt.Print(t.Value, " ")}fmt.Println()// 从头部向尾部遍历for t := l.Front(); t != nil; t = t.Next() {fmt.Print(t.Value, " ")}fmt.Println()
}func main() {values := list.New()        // 创建一个新的链表e1 := values.PushBack("一")  // 插入元素到链表尾部e2 := values.PushBack("二")values.PushFront("三")      // 插入元素到链表头部values.InsertBefore("四", e1) // 在e1之前插入"四"values.InsertAfter("五", e2)  // 在e2之后插入"五"values.Remove(e2)           // 移除元素e2printList(values)values.Init()               // 初始化链表fmt.Println("链表初始化后:", values)// 插入一组数字for i := 0; i < 10; i++ {values.PushFront(strconv.Itoa(i))}printList(values)
}

在这个代码段中,我们演示了链表的常见操作,包括在链表的头部和尾部插入元素、在指定元素前后插入新元素、移除元素以及遍历链表。

执行结果

当你运行上面的代码时,输出可能如下:

五 四 一 三 
三 一 四 五 
链表初始化后: &{{0xc000012000 0xc000012000 <nil> <nil>} 0}
9 8 7 6 5 4 3 2 1 0 
0 1 2 3 4 5 6 7 8 9 

可以看到,链表的初始化将链表清空,之后的循环插入操作重新填充了链表。

通过本文的介绍,我们详细讲解了Go语言中container包的环形链表和双向链表的实现与应用。掌握这些数据结构后,你可以在需要灵活的数据存储和遍历时高效地选择合适的结构。

相关文章:

深入解析Go语言的容器包

在Go语言中&#xff0c;container标准包为开发者提供了三个非常有用的数据结构&#xff1a;堆&#xff08;heap&#xff09;、链表&#xff08;list&#xff09;和环&#xff08;ring&#xff09;。这些数据结构的实现分别位于container/heap、container/list和container/ring中…...

STM32 + W5500 实现HTTPS !

两点: 1. 让我们先站在操作系统之上的网络协议栈再之上来思考…… 2. 我们先简单粗暴地理解为:http + (加密)= https 先弄一个简单的HTTP网络客户端,连接服务器并读取默认页面。该应用程序可能如下所示: #include <sys/types.h> #include <sys/socket.h> …...

使用DuckDuckGo搜索API进行高效信息检索:Python实践指南

使用DuckDuckGo搜索API进行高效信息检索&#xff1a;Python实践指南 引言 在当今信息爆炸的时代&#xff0c;快速准确地获取所需信息变得越来越重要。DuckDuckGo作为一个注重隐私的搜索引擎&#xff0c;提供了强大的搜索API&#xff0c;让开发者能够轻松地将搜索功能集成到自…...

UE4_后期处理_后期处理材质四—场景物体描边

一、效果如下图&#xff1a; 二、分析&#xff1a; 回顾复习&#xff1a;在后期处理材质三中&#xff0c;我们通过计算开启自定义深度通道物体的像素点上下左右4个像素SceneTextureCustomDepth深度之和来判断物体的外部&#xff08;包含物体的边&#xff09;和内部&#xff0c…...

华为OD机试 - 推荐多样性(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…...

梧桐数据库(WuTongDB):CBO(Cost-Based Optimizer)基于代价的优化器技术简介

CBO&#xff08;基于代价的优化器&#xff0c;Cost-Based Optimizer&#xff09;是现代数据库系统中最广泛使用的查询优化器之一。它通过计算执行查询时可能消耗的资源&#xff08;如CPU、内存、I/O&#xff09;来选择最优的执行计划&#xff0c;以提高查询性能。 1. CBO 的工…...

深入探索Go语言中的函数:匿名函数、指针参数与函数返回

1. Go语言中的函数 函数是任何编程语言中的核心元素&#xff0c;它们帮助我们将大型程序分解为更小的、易于管理的部分。在Go语言中&#xff0c;函数是通过 func 关键字定义的。理想的函数应当是独立的&#xff0c;完成单一任务。如果你发现某个函数正在执行多个任务&#xff…...

Android12_13左上角状态栏数字时间显示右移动

文章目录 问题场景解决问题 一、基础资料二、代码追踪三、解决方案布局的角度解决更改paddingStart 的默认值设置marginLeft 值 硬编码的角度解决 问题场景 1&#xff09;早期一般屏幕都是方形的&#xff0c;但是曲面屏&#xff0c;比如&#xff1a;好多车机Android产品、魔镜…...

望繁信科技携流程智能解决方案亮相CNDS 2024新能源产业数智峰会

9月13日&#xff0c;CNDS 2024中国新能源产业数智峰会在北京圆满落幕。本次峰会以“走向数字新能源”为主题&#xff0c;汇聚了来自新能源领域的顶尖领袖、专家学者及知名企业代表&#xff0c;共同探讨数字化技术在新能源行业中的创新应用和发展趋势。上海望繁信科技有限公司&a…...

nginx负载均衡(轮询与权重)

文章目录 1. nginx的介绍2. nginx使用场景3. nginx在windows的下载与安装4. nginx的简单使用5. nginx进行轮询测试6. nginx进行权重测试7. 总结 1. nginx的介绍 Nginx&#xff08;engine x&#xff09;是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也是一个开源的、…...

【计算机网络】网络通信中的端口号

文章目录 一、引入端口号二、端口号的作用三、端口号的确定 在TCP/IP协议中&#xff0c;传输层有两个重要的协议&#xff1a;TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;。TCP用于提供可靠的数据传输&#xff0c;而UDP则适合用于广播…...

Python 解析 JSON 数据

1、有如下 JSON 数据&#xff0c;存放在 data.json 文件&#xff1a; [{"id":1, "name": "小王", "gender": "male", "score": 96.8}, {"id":2, "name": "小婷", "gender&qu…...

利用LlamaIndex构建ARG本地知识库

文章目录 1. 环境准备2. 启用诊断日志3. 配置本地模型4. 配置本地向量模型5. LlamaIndex全局配置6. 创建 PGVectorStore7. 从数据库加载数据8. 文本分割器: SpacyTextSplitter9. 配置管道10. 创建向量存储索引11 .指定响应模式&#xff0c;以及启用流式响应 在现代的人工智能应…...

PCM的缺点

PCM的主要缺点包括需要较大的‌数据传输带宽和‌存储空间&#xff0c;导致无法实现‌高压缩比&#xff0c;相对较低的‌数据压缩效率。‌‌ PCM&#xff08;脉冲编码调制&#xff09;作为一种无损编码技术&#xff0c;虽然能够保留原始信号的完整性&#xff0c;适用于需要高保…...

【C语言】(指针系列四)回调函数+qsort函数

一、回调函数 回调函数就是通过函数指针调用的函数 如果你把函数的指针作为参数传递给另外一个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xff0c;被调用的函数就是回调函数。回调函数并不是一个单一的函数实现的&#xff0c;而是在某种情况下&#xff0c;编…...

全面理解tensor编程中矩阵的行和列

经常会在编程中遇到理解矩阵行和列的事情。 1、要明确无论这个张量有多少维度&#xff0c;它的矩阵乘法都只能作用于最后两个维度。 例如&#xff1a; import torcha torch.rand([64, 32, 3, 4]) b torch.rand([64, 32, 3, 4])c torch.matmul(a, b.transpose(2, 3)) # 交…...

【Kubernetes】常见面试题汇总(十)

目录 29.简述 Kubernetes 自动扩容机制&#xff1f; 30.简述 Kubernetes Service 类型&#xff1f; 31.简述 Kubernetes Service 分发后端的策略&#xff1f; 32.简述 Kubernetes Headless Service &#xff1f; 29.简述 Kubernetes 自动扩容机制&#xff1f; &#xff08;…...

CSS —— 界面布局

flexbox - 弹性盒子布局&#xff08;弹性布局&#xff09; 一维方向&#xff0c;横纵向排列。 采用flex布局的元素&#xff0c;称为 Flex 容器&#xff08;flex container&#xff09;&#xff0c;简称"容器" flex-direction 用于设置主轴方向&#xff1b;子元素默…...

SpringBoot万级并发-jemeter-Address already in use: connect

一、场景 用Jmeter压力单测接口的时候&#xff0c;发现报 Response code:Non HTTP response code: java.net.BindException Response message:Non HTTP response message: Address already in use: connect 然后我这边是wondows的电脑操作压测的&#xff0c;操作系统win10&…...

P1228 地毯填补问题

![](地毯填补问题 - 洛谷) #include<bits/stdc.h> using namespace std; #define qw dfs(zxl-1,zyl-1,zx,zy,l); #define we dfs(zxl-1,zyl,zx,zyl,l); #define er dfs(zxl,zyl-1,zxl,zy,l); #define rt dfs(zxl,zyl,zxl,zyl,l);void dfs(int x,int y,int zx,int zy,int…...

鸿蒙Next通讯录实战:用ArkUI 3.0手把手教你打造新建联系人页面(附完整代码)

鸿蒙Next通讯录实战&#xff1a;用ArkUI 3.0构建企业级新建联系人页面 在移动应用开发领域&#xff0c;通讯录功能一直是检验开发者UI构建和数据管理能力的经典场景。鸿蒙Next作为新一代分布式操作系统&#xff0c;其ArkUI 3.0框架为开发者提供了声明式UI编程范式&#xff0c;让…...

避坑指南:SpringBoot整合Drools 7.20时热部署冲突的解决方案

SpringBoot与Drools 7.20热部署冲突深度排查指南 当SpringBoot的devtools热部署功能遇上Drools规则引擎&#xff0c;就像两个高效率的工人同时修改同一台机器——看似都能独立工作&#xff0c;组合时却可能引发难以察觉的运行时故障。本文将带您深入这个典型的技术冲突现场&…...

OpenClaw效率对比:GLM-4.7-Flash与云端API实测数据

OpenClaw效率对比&#xff1a;GLM-4.7-Flash与云端API实测数据 1. 测试背景与动机 上周在优化个人自动化工作流时&#xff0c;我遇到了一个实际选择难题&#xff1a;应该用本地部署的GLM-4.7-Flash模型&#xff0c;还是继续使用云端API服务&#xff1f;这个问题看似简单&…...

跨平台终端工具cmatrix:打造震撼的数字雨可视化效果

跨平台终端工具cmatrix&#xff1a;打造震撼的数字雨可视化效果 【免费下载链接】cmatrix Terminal based "The Matrix" like implementation 项目地址: https://gitcode.com/gh_mirrors/cm/cmatrix 你是否曾幻想过在自己的终端中重现《黑客帝国》里令人着迷的…...

基于springboot家庭影像管理系统设计与开发(源码+精品论文+答辩PPT等资料)

博主介绍&#xff1a;CSDN毕设辅导第一人、靠谱第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交…...

从理论到实践:在快马平台构建基于openclaw的物流分拣仿真系统

最近在研究物流自动化分拣系统时&#xff0c;发现openclaw机械爪控制在实际应用中存在不少痛点。传统开发流程需要从零搭建仿真环境、编写控制逻辑、调试物理交互&#xff0c;整个过程耗时耗力。于是尝试用InsCode(快马)平台快速构建了一个物流分拣仿真系统&#xff0c;效果出乎…...

OpenClaw大模型API怎么选?Kimi与DeepSeek实测指南

最适配 OpenClaw 的大模型 API 是哪个&#xff1f;四款模型实测对比与选型指南&#xff08;2026年3月&#xff09; OpenClaw 内置 ReAct Agent 架构&#xff0c;通过工具调用&#xff08;Tool Use&#xff09;驱动 Shell 执行、文件操作、浏览器控制、截图等自动化任务。模型的…...

Python实战:5分钟搞定Paillier同态加密的安装与基础使用(附避坑指南)

Python实战&#xff1a;5分钟搞定Paillier同态加密的安装与基础使用&#xff08;附避坑指南&#xff09; 隐私计算领域近年来发展迅猛&#xff0c;而同态加密作为其核心技术之一&#xff0c;正在金融、医疗等行业的数据协作场景中发挥越来越重要的作用。Paillier算法作为支持加…...

CentOS7快速部署Golang 1.22.2开发环境全攻略

1. 为什么选择CentOS7部署Golang 1.22.2 最近在帮团队搭建新的开发环境时&#xff0c;我发现很多同事还在用老旧的Golang版本。作为目前最稳定的Linux发行版之一&#xff0c;CentOS7依然是企业级开发环境的首选。而Golang 1.22.2作为2024年发布的最新稳定版&#xff0c;带来了不…...

保姆级教程:NLI-DistilRoBERTa快速部署与简单调用指南

保姆级教程&#xff1a;NLI-DistilRoBERTa快速部署与简单调用指南 1. 项目概述与核心能力 NLI-DistilRoBERTa是基于DistilRoBERTa模型的自然语言推理(Natural Language Inference)Web服务&#xff0c;专门用于分析两个句子之间的逻辑关系。这个轻量级模型保留了RoBERTa模型90…...