Go标准容器之Ring的使用说明
来源:脚本之家
2022-12-24 18:07:43
0浏览
收藏
怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Go标准容器之Ring的使用说明》,涉及到标准容器、Ring,有需要的可以收藏一下
简介
Go的标准包Container中包含了常用的容器类型,包括conatiner/list,container/heap,container/ring,本篇讲解container/ring的使用。
ring包
ring包提供了环形链表的操作。它仅导出了一个类型,Ring:
// Ring表示环形链表中的元素。 type Ring struct { Value interface{} // Value类型为interface{},因此可以接受任意类型 } // 创建一个长度为n的环形链表 func New(n int) *Ring // 针对环形链表中的每一个元素x进行f(x)操作 func (r *Ring) Do(f func(interface{})) // 获取环形链表长度 func (r *Ring) Len() int // 如果r和s在同一环形链表中,则删除r和s之间的元素, // 被删除的元素组成一个新的环形链表,返回值为该环形链表的指针(即删除前,r->Next()表示的元素) // 如果r和s不在同一个环形链表中,则将s插入到r后面,返回值为 // 插入s后,s最后一个元素的下一个元素(即插入前,r->Next()表示的元素) func (r *Ring) Link(s *Ring) *Ring // 移动 n % r.Len() 个位置,n正负均可 func (r *Ring) Move(n int) *Ring // 返回下一个元素 func (r *Ring) Next() *Ring // 返回前一个元素 func (r *Ring) Prev() *Ring // 删除r后面的 n % r.Len() 个元素 func (r *Ring) Unlink(n int) *Ring
示例
Ring的用法
package main import ( "container/ring" "fmt" ) func main() { const rLen = 3 // 创建新的Ring r := ring.New(rLen) for i := 0; i <h3>模拟约瑟夫问题</h3> <p>环形列表可以模拟约瑟夫问题。约瑟夫问题描述如下:</p> <p><strong>来自百度:</strong></p> <blockquote> <p>据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。</p> </blockquote> <p>用代码模拟如下:</p> <pre class="brush:plain;"> package main import ( "container/ring" "fmt" ) type Player struct { position int // 位置 alive bool // 是否存活 } func main() { const ( playerCount = 41 // 玩家人数 startPos = 1 // 开始报数位置 ) deadline := 3 r := ring.New(playerCount) // 设置所有玩家初始值 for i := 1; i 1 { r = r.Move(startPos - 1) } counter := 1 // 报数从1开始,因为下面的循环从第二个开始计算 deadCount := 0 // 死亡人数,初始值为0 for deadCount <p>输出如下,可以看到16和31是最后两个出队列的,因此Josephus将他的朋友与自己安排在第16个与第31个位置是安全的。</p> <blockquote> <p>Player 3 died!<br> Player 6 died!<br> Player 9 died!<br> Player 12 died!<br> Player 15 died!<br> Player 18 died!<br> Player 21 died!<br> Player 24 died!<br> Player 27 died!<br> Player 30 died!<br> Player 33 died!<br> Player 36 died!<br> Player 39 died!<br> Player 1 died!<br> Player 5 died!<br> Player 10 died!<br> Player 14 died!<br> Player 19 died!<br> Player 23 died!<br> Player 28 died!<br> Player 32 died!<br> Player 37 died!<br> Player 41 died!<br> Player 7 died!<br> Player 13 died!<br> Player 20 died!<br> Player 26 died!<br> Player 34 died!<br> Player 40 died!<br> Player 8 died!<br> Player 17 died!<br> Player 29 died!<br> Player 38 died!<br> Player 11 died!<br> Player 25 died!<br> Player 2 died!<br> Player 22 died!<br> Player 4 died!<br> Player 35 died!<br> Player 16 died!<br> Player 31 died!</p> </blockquote> <p><strong>补充:go语言中container容器数据结构heap、list、ring</strong></p> <h2>heap堆的使用:</h2> <pre class="brush:xhtml;"> package main import ( "container/heap" "fmt" ) type IntHeap []int //我们自定义一个堆需要实现5个接口 //Len(),Less(),Swap()这是继承自sort.Interface //Push()和Pop()是堆自已的接口 //返回长度 func (h *IntHeap) Len() int { return len(*h); } //比较大小(实现最小堆) func (h *IntHeap) Less(i, j int) bool { return (*h)[i] <h2>list链表的使用:</h2> <pre class="brush:xhtml;"> package main; import ( "container/list" "fmt" ) func printList(l *list.List) { for e := l.Front(); e != nil; e = e.Next() { fmt.Print(e.Value, " "); } fmt.Println(); } func main() { //创建一个链表 l := list.New(); //链表最后插入元素 a1 := l.PushBack(1); b2 := l.PushBack(2); //链表头部插入元素 l.PushFront(3); l.PushFront(4); printList(l); //取第一个元素 f := l.Front(); fmt.Println(f.Value); //取最后一个元素 b := l.Back(); fmt.Println(b.Value); //获取链表长度 fmt.Println(l.Len()); //在某元素之后插入 l.InsertAfter(66, a1); //在某元素之前插入 l.InsertBefore(88, a1); printList(l); l2 := list.New(); l2.PushBack(11); l2.PushBack(22); //链表最后插入新链表 l.PushBackList(l2); printList(l); //链表头部插入新链表 l.PushFrontList(l2); printList(l); //移动元素到最后 l.MoveToBack(a1); printList(l); //移动元素到头部 l.MoveToFront(a1); printList(l); //移动元素在某元素之后 l.MoveAfter(b2, a1); printList(l); //移动元素在某元素之前 l.MoveBefore(b2, a1); printList(l); //删除某元素 l.Remove(a1); printList(l); }
ring环的使用:
package main; import ( "container/ring" "fmt" ) func printRing(r *ring.Ring) { r.Do(func(v interface{}) { fmt.Print(v.(int), " "); }); fmt.Println(); } func main() { //创建环形链表 r := ring.New(5); //循环赋值 for i := 0; i <p>以上为个人经验,希望能给大家一个参考,也希望大家多多支持golang学习网。如有错误或未考虑完全的地方,望不吝赐教。</p><p>以上就是《Go标准容器之Ring的使用说明》的详细内容,更多关于golang的资料请关注golang学习网公众号!</p>
版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除

- 上一篇
- Golang: 内建容器的用法

- 下一篇
- go语言中GOPATH GOROOT的作用和设置方式
评论列表
-
- 可爱的天空
- 感谢大佬分享,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢师傅分享文章内容!
- 2023-03-10 07:34:02
-
- 怕孤单的墨镜
- 这篇博文真是及时雨啊,细节满满,受益颇多,已加入收藏夹了,关注楼主了!希望楼主能多写Golang相关的文章。
- 2023-01-12 20:17:54
查看更多
最新文章
-
- Golang · Go教程 | 4分钟前 |
- Golang反射解析RPC参数技巧分享
- 169浏览 收藏
-
- Golang · Go教程 | 20分钟前 |
- Golangswitch中fallthrough的作用是什么
- 274浏览 收藏
-
- Golang · Go教程 | 23分钟前 |
- C++实现Go接口隐式方法
- 315浏览 收藏
-
- Golang · Go教程 | 29分钟前 | golang 通道 非阻塞 selectdefault 忙等待
- Golangselectdefault非阻塞用法解析
- 277浏览 收藏
-
- Golang · Go教程 | 34分钟前 |
- Golang文件管理开发入门指南
- 170浏览 收藏
-
- Golang · Go教程 | 46分钟前 |
- GolangServerless冷启动优化全攻略
- 290浏览 收藏
-
- Golang · Go教程 | 47分钟前 |
- Golang工厂模式:简单工厂与抽象工厂对比
- 485浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golang搭建NATS高性能消息队列教程
- 269浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golang时间处理技巧:格式化与计算详解
- 432浏览 收藏
查看更多
课程推荐
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 514次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 499次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
查看更多
AI推荐
-
- AI Mermaid流程图
- SEO AI Mermaid 流程图工具:基于 Mermaid 语法,AI 辅助,自然语言生成流程图,提升可视化创作效率,适用于开发者、产品经理、教育工作者。
- 603次使用
-
- 搜获客【笔记生成器】
- 搜获客笔记生成器,国内首个聚焦小红书医美垂类的AI文案工具。1500万爆款文案库,行业专属算法,助您高效创作合规、引流的医美笔记,提升运营效率,引爆小红书流量!
- 607次使用
-
- iTerms
- iTerms是一款专业的一站式法律AI工作台,提供AI合同审查、AI合同起草及AI法律问答服务。通过智能问答、深度思考与联网检索,助您高效检索法律法规与司法判例,告别传统模板,实现合同一键起草与在线编辑,大幅提升法律事务处理效率。
- 628次使用
-
- TokenPony
- TokenPony是讯盟科技旗下的AI大模型聚合API平台。通过统一接口接入DeepSeek、Kimi、Qwen等主流模型,支持1024K超长上下文,实现零配置、免部署、极速响应与高性价比的AI应用开发,助力专业用户轻松构建智能服务。
- 692次使用
-
- 迅捷AIPPT
- 迅捷AIPPT是一款高效AI智能PPT生成软件,一键智能生成精美演示文稿。内置海量专业模板、多样风格,支持自定义大纲,助您轻松制作高质量PPT,大幅节省时间。
- 590次使用
查看更多
相关文章
-
- Golangmap实践及实现原理解析
- 2022-12-28 505浏览
-
- 试了下Golang实现try catch的方法
- 2022-12-27 502浏览
-
- 如何在go语言中实现高并发的服务器架构
- 2023-08-27 502浏览
-
- go和golang的区别解析:帮你选择合适的编程语言
- 2023-12-29 502浏览
-
- 提升工作效率的Go语言项目开发经验分享
- 2023-11-03 502浏览