Go基础语法:ring

golang channel 最详细的源码剖析 大纲 文章目录channel 是什么?channel 使用姿势chan 创建chan 入队chan 出队结合 select 语句结合 for-range 语句源码解析`makechan`hchan 结构chansendchanrecvselectnbsendselectnbrecvselectnbrecv2chanrecv2总结 chan 是 golang 的最重要的一个结构,是区别于其他高级语言的最重要的特色之一,也是 goroutine 通信必须要的要素之一。很多人用它,但是很少人彻底理解过它,甚至 c 阅读详情

概述

Ring是一种循环链表结构,没有头尾,从任意一个节点出发都可以遍历整个链。其定义如下,Value表示当前节点的值:

type Ring struct {
        Value interface{} 
}

类型方法

New

Ring.New用于创建一个新的Ring,接收一个整形参数,用于初始化Ring的长度,其方法定义如下:

func New(n int) *Ring

Next & Prev

作为一个链表,最重要的操作进行遍历,可以通过Next和Prev方法获取当前节点的上一个节点和下一个节点,方法定义如下:

func (r *Ring) Next() *Ring
func (r *Ring) Prev() *Ring

通过这两个方法可以对一个ring进行遍历,首先保存当前节点,然后依次访问下一个节点,直到回到起始节点,代码实现如下:

p := ring.Next()
//  do something with first element
for p != ring {
    // do something with current element
    
    p = p.Next()
}

Link & Unlink

Link将两个ring连接到一起,而Unlink将一个ring拆分为两个,移除n个元素并组成一个新的ring,这两个操作组合起来可以对多个链表进行管理,方法声明如下:

func (r *Ring) Link(s *Ring) *Ring
func (r *Ring) Unlink(n int) *Ring

Do

前面通过Next方法对ring进行了遍历,由于这类操作的广泛存在,所以Ring包中还提供了一个额外的方法Do,方法接收一个函数作为参数,方法声明如下:

func (r *Ring) Do(f func(interface{}))

在调用Ring.Do时,会依次将每个节点的Value当做参数调用这个函数,实际上这是策略方法的应用,通过传递不同的函数,可以在同一个ring上实现多种不同的操作。下面展示一个简单的遍历打印程序。

package main

import (
	"container/ring"
	"fmt"
)

func main() {
	r := ring.New(10)

	for i := 0; i < 10; i++ {
		r.Value = i
		r = r.Next()
	}

	sum := SumInt{}
	r.Do(func(i interface{}) {
		fmt.Println(i)
	})
}

除了简单的无状态程序外,也可以通过结构体保存状态,例如下面是一个对ring上值求和的程序。

package main

import (
	"container/ring"
	"fmt"
)

type SumInt struct {
	Value int
}

func (s *SumInt) add(i interface{}) {
	s.Value += i.(int)
}

func main() {
	r := ring.New(10)

	for i := 0; i < 10; i++ {
		r.Value = i
		r = r.Next()
	}

	sum := SumInt{}
	r.Do(sum.add)
	fmt.Println(sum.Value)
}
Go-ring-提供了一个高性能和线程安全的bloom过滤器Go实现 ring - 提供了一个高性能和线程安全的bloom过滤器Go实现 立即下载

相关推荐

深入浅出DDR系列(二)--DDR工作原理

学习完了DDR的基本组成和硬件结构原理之后,从整体上了解了DDR的特性和静态图,包括原理、管脚图等。那么本章就要从动态的角度来分析时序结构,包括read/write的整个过程到数据返回发生了什么,其中包括以下内容 DDR是如何完成Read、Write 等的操作 DDR的基本命令 DDR的时序参数 DDR的性能分析 1. DRAM基本组成 对于DRAM,其主要由行和列组成,每一个bit中都是由类似右下图的类晶体管的结构组成,对于sdram的数据,可以通过控制column和row就可以访问sd

奇小葩 3万+

go Ring(环形链表)源码解读与应用

首先是环形链表的结构与初初始化 type Ring struct { next, prev *Ring Value interface{} // for use by client; untouched by this library } func (r *Ring) init() *Ring { r.next = r r.prev = r return r }   ...

qq_38020553的博客 1443

Numpy快速入门(np)!看这一篇就够了

Numpy快速入门(np)!看这一篇就够了

weixin_74009895的博客 2681

Go——container包(list、ring、heap)

List:双向链表Ring:循环链表,也就是环Heap:堆。

吴声子夜歌的博客 644

从传统扫描到SSN:Tessent数据包技术如何减少90%测试时间

本文深入探讨了Tessent流式扫描网络(SSN)如何通过其核心的数据包技术,彻底改变芯片测试范式。该技术将测试数据封装成标准化数据包,在共享总线上进行智能路由与分发,实现了动态带宽分配与核心独立测试,从而将复杂SoC(如AI芯片)的总体测试时间大幅削减90%,并显著提升测试灵活性与可扩展性。

meat5的博客 493

从Axure转Figma?这篇编组、缩放、圆角、评论的对比指南帮你无缝切换

本文为资深Axure设计师提供了向Figma无缝迁移的实战指南。文章深度对比了编组、缩放、圆角、评论等核心操作,重点解析了Figma独特的自动布局、组件系统和实时协作功能,旨在帮助用户快速适应新工具,实现设计思维与工作效率的跃迁。

tomato的博客 852

go标准库——ring的实现

// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package ring implements operations on circular lists. package ring // A Ring is an element o

Go的全部 309

vscode使用continue插件连接LM studio的模型

本文详细介绍了如何使用VSCode的Continue插件连接LM Studio模型。主要步骤包括:在LM Studio中加载模型并设置相关参数,启动API服务,修改Continue配置文件以集成LM Studio模型,并进行测试以验证连接是否成功。通过这些步骤,用户可以将LM Studio中的预训练模型与VSCode的Continue插件无缝对接,实现高效的自然语言处理和编程辅助功能。

weixin_43590837的博客 8632

Go:环形链表实现,container/ring包解析

环形链表的操作通常具有固定的时间复杂度,因为添加、删除或移动操作只需修改几个指针即可。然而,与数组或切片相比,环形链表在随机访问数据时效率较低,因为必须从链表的起始位置开始遍历。环形链表是一种链表,其中的最后一个元素指向第一个元素,形成一个闭环。元素都包含一个指向下一个元素的指针和一个指向前一个元素的指针,如果链表只有一个元素,则这两个指针都指向元素本身。包提供了一个功能强大的环形链表实现,适合在需要循环数据处理的各种应用中使用。包,开发者可以有效地管理和操作环形数据结构,优化程序的性能和资源利用率。

十年运维开发经验的王义杰在此分享自己的知识和经验 921

Rstan下载安装攻略

准备把Rtools删掉,重新下载(胡乱猜测是安装顺序的问题),但是卸载时显示Rtools被占用,但我已经把该关的都关了。这一问题的出现,直接让我卸载掉了Rstudio,又重新安装了一个,不过这次安装在另一个磁盘,因为原来的内存不多了。或者参考知乎,使用清华镜像网址进行下载:(知乎链接)https://zhuanlan.zhihu.com/p/346947595(清华下载链接)https://mirrors.tuna.tsinghua.edu.cn/CRAN/bin/windows/Rtools/

m0_64643017的博客 3101

使用Zed 实现测距

此代码基于官方代码基础上进行改写,主要是获取zed相机深度画面的深度值,为yolo测距打基础。Zed相机是由Stereolabs公司开发的一种先进的立体视觉相机。这种相机专为计算机视觉和机器学习应用而设计,能够提供高质量的3D捕捉和分析功能。: Zed相机配备有一对垂直排列的传感器,能够捕捉两个略有偏移的图像,从而模拟人的双眼视觉,实现深度感知。: 利用立体成像技术,Zed相机能够实时生成环境的3D模型,这对于机器人导航、增强现实(AR)和虚拟现实(VR)等应用至关重要。

weixin_45303602的博客 913

Go标准容器之Ring

简介Go的标准包Container中包含了常用的容器类型,包括conatiner/list,container/heap,container/ring,本篇讲解container/ring的使用。ring包ring包提供了环形链表的操作。它仅导出了一个类型,Ring:// Ring表示环形链表中的元素。 type Ring struct { Value interface{} // Valu

Cynhard的专栏 4557

手把手教你学pcie--内存管理和保护机制(一):MPU与其他内存管理和保护机制详解

MPU(Memory Protection Unit)是一种专门用于 ​。,这些机制通常协同工作,形成多层防御体系,兼顾安全性、性能和灵活性。

MHD0815的博客 280

Golang基础(变量[普通变量、数组、切片、map、list、ring]声明及赋值)

Go语言和其他语言一样都有基本存储容器.可以存储一个或多个值在程序中,方便程序中多次使用容器中内容,这个容器称为:变量 Go语言虽然是静态类型语言,但是支持动态类型语言语法,因为Go语言希望程序员少声明变量,增加GC效率 一、变量命名规则 以字母或下划线开头(Go语言中多不以_开头) 后面可以是任意数量的字符、数字和下划线 区分大小写 不能是关键字(关键字具备特定含义),下面是Go语言的关键字 关键字如下 ...

qq_31387691的博客 3462

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

革命性操作系统内核gopher-os:用Go语言挑战Ring-0编程的终极指南

探索如何用Go语言编写操作系统内核的完整教程!gopher-os是一个革命性的概念验证项目,它证明了Go语言确实适合编写运行在Ring-0级别的底层代码。这个开源项目展示了Go语言在系统编程领域的强大潜力,为开发者提供了一个学习和实验操作系统内核开发的绝佳平台。 ## 🚀 为什么选择Go语言编写操作系统内核? 传统的操作系统内核通常使用C或汇编语言编写,但gopher-os项目勇敢地挑战了这

gitblog_00798的博客 613

240多道!Go开发岗位面试题合集(含答案)

REDS 中只存20w 的数据,如何保证 REDIS 中的数据都是热点数据?24、有否在创建有状态性的 DOCKER 应用的较好实践?37、假如 REDIS 里面有 1亿个 KEY,其中有 10w 个KEY 是以某个固定的已知的前缀开头的,如果将它们全部找出来?30、为什么 DOCKER COMPOSE采取的是并不等待前面依赖服务项的容器启动就绪后再启动的组合容器启动策略?20、看下面代码的 DEFER 的执行顺序是什么?13、什么类型的应用 (无状态性或有状态性) 更适合 DOCKER 容器技术?

weixin_43507410的博客 2694

Golang基础面试题汇总

channel、goroutine、slice、map、反射、内存、GC、Musql、Redis、ELK、K8s、Http、Https

weixin_41760738的博客 5697

【Go 1.26.4】Golang Channel 深度解析

Golang Channel 深度解析

zhonglinzhang 907

2023Go面试问答_Go基础

2023Go面试问答_Go基础

suli77的博客 316

【后端百科】golang channel深入理解

Channel是Go语言中的一种特殊类型,它像一个队列一样,遵循先进先出(FIFO)的原则,确保数据的顺序性。每个Channel都有一个指定的类型,只能传递相同类型的数据。Channel是并发安全的,允许多个goroutine同时读写,而不会引发数据竞争。Channel的主要作用是实现goroutine之间的通信和同步。通过Channel,一个goroutine可以发送数据到另一个goroutine,从而实现数据的交换和共享。

ThisIsClark 1628

Java开发者转型Go语言的进阶学习路径与实战经验

Go语言作为现代高并发编程的代表语言,其轻量级协程(goroutine)和通道(channel)机制彻底改变了并发编程范式。理解GMP调度模型和CSP并发理论是掌握Go的核心,这使开发者能构建高性能的分布式中间件。对于Java转型开发者,需要特别注意避免将OOP思维强加于Go的简洁哲学,重点突破指针操作、内存管理等系统级编程能力。典型应用场景包括微服务架构、云原生中间件开发等,通过实现线程池、RPC框架等实战项目可快速提升工程能力。性能优化方面需关注goroutine泄漏、GC停顿等关键指标,工具链如ppr

weixin_33738982的博客 595

终极摄像头流媒体解决方案:go2rtc让多协议转换变得如此简单

你是否曾为家中不同品牌摄像头无法统一管理而烦恼?是否在寻找一个能同时支持RTSP、WebRTC、HLS等多种流媒体格式的工具?go2rtc正是你需要的解决方案——一个零依赖、零延迟的跨平台摄像头流媒体应用程序,能够将各种协议的视频流统一转换为标准格式,让你在任何设备上都能流畅观看。 ## 🎯 为什么你需要go2rtc? 在智能家居和安防监控领域,摄像头协议碎片化是一个普遍问题。海康威视使用R

gitblog_00149的博客 481

c ringbuffer 源码_golang chan 最详细原理剖析,全面源码分析!看完不可能不懂的!...

大纲channel 是什么?channel 使用姿势chan 创建chan 入队chan 出队结合 select 语句结合 for-range 语句源码解析`makechan`hchan 结构chansendchanrecvselectnbsendselectnbrecvselectnbrecv2chanrecv2总结概述chan 是 golang 的最重要的一个结构,是区别于其他高级语言的最重要...

weixin_39942037的博客 249

c ringbuffer 源码_golang channel 最详细的源码剖析

大纲channel 是什么?channel 使用姿势chan 创建chan 入队chan 出队结合 select 语句结合 for-range 语句源码解析`makechan`hchan 结构chansendchanrecvselectnbsendselectnbrecvselectnbrecv2chanrecv2总结chan 是 golang 的最重要的一个结构,是区别于其他高级语言的最重要的特...

weixin_39548606的博客 272

go2rtc 摄像头流媒体完整指南:一个程序统一 15+ 协议,3 分钟跑通低延迟直播

五台不同品牌的摄像头,五个 App,还是看不过来——这是老张的真实困境。直到他遇见 go2rtc,一个开源摄像头流媒体网关:把 RTSP、Tapo、小米这类五花八门的协议统一翻译,让任何设备都能直接低延迟播放。 老张家客厅是大华的 RTSP,门口是 TP-Link Tapo,阳台是小米,窗台还有两台只认自家私有协议的杂牌。过去他想在 Home Assistant 里统一看画面,撞上的麻烦一个接一

gitblog_00258的博客 240

Go Channel缓冲队列原理与高性能实现技巧

Channel是Go语言并发编程的核心组件,其缓冲队列采用环形数据结构实现goroutine间安全通信。环形队列通过维护发送/接收索引实现高效循环存取,配合互斥锁保证线程安全。在分布式系统和微服务架构中,合理设置缓冲区大小能显著提升吞吐量,而批处理和零拷贝等技术可进一步优化性能。本文以make(chan T, n)的底层实现为例,解析hchan结构体的关键字段,并给出缓冲区容量选择、死锁规避等实战建议,帮助开发者构建高并发的Go应用。

weixin_34176694的博客 493
上一篇: Go基础语法:list
下一篇: pytorch处理文本数据代码-处理文本相似度数据
onnx
博客等级 码龄5年 1万+粉丝 416原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

onnx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值