【go从零单排】迭代器(Iterators)
🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。
📗概念
在 Go 语言中,迭代器的实现通常不是通过语言内置的迭代器类型,而是通过自定义类型和方法来实现的。下面是一个简单的示例,展示如何在 Go 中实现一个迭代器。
💻代码
迭代器
package mainimport "fmt"// IntSliceIterator 是一个自定义的迭代器,用于迭代整数切片
type IntSliceIterator struct {//data:存储要迭代的整数切片。//index:当前迭代的位置。data []intindex int
}// 定义NewIntSliceIterator函数,输入data切片类型为int
// 返回一个指向 IntSliceIterator 结构体的指针。
func NewIntSliceIterator(data []int) *IntSliceIterator {//&IntSliceIterator{} 创建了一个新的 IntSliceIterator 实例并返回return &IntSliceIterator{data: data,index: 0,}
}// HasNext 检查是否还有下一个元素
func (it *IntSliceIterator) HasNext() bool {return it.index < len(it.data)
}// 定义Next函数 返回下一个元素并移动迭代器
// 输入*IntSliceIterator指针,赋值给it变量
// 返回一个int类型
func (it *IntSliceIterator) Next() int {if !it.HasNext() {//如果没有更多元素,使用 panic 抛出一个错误panic("No more elements")}//从data 切片中获取当前索引 it.index 指向的元素,并将其赋值给 value。value := it.data[it.index]//将 index 增加 1,下次调用时指向下一个元素。it.index++return value
}func main() {data := []int{1, 2, 3, 4, 5}iterator := NewIntSliceIterator(data)for iterator.HasNext() {fmt.Println(iterator.Next())}
}//输出
//1
//2
//3
//4
//5
yeild
在python中yeild表示本次执行结束并返回值,类似于return,yeild和return不同的地方在于yeild可以优雅的返回每次调用时的值。
在go中没有yeild关键字,我们用yeild方便理解。
package mainimport ("fmt""iter""slices"
)// 这不是来了么,定义一个泛型List 任意类型的struct
type List[T any] struct {head, tail *element[T]
}// 老样子,定义element泛型struct 任意类型,是一个链表
type element[T any] struct {next *element[T]val T
}// 链表的push方法
func (lst *List[T]) Push(v T) {if lst.tail == nil {lst.head = &element[T]{val: v}lst.tail = lst.head} else {lst.tail.next = &element[T]{val: v}lst.tail = lst.tail.next}
}// 输入为lst,类型为 *List[T],返回一个函数,这个函数的类型是 iter.Seq[T],是一个迭代器
func (lst *List[T]) All() iter.Seq[T] {//返回值是一个匿名函数,接受一个参数 yield,这个参数是一个函数类型,接受一个类型为 T 的参数并返回一个布尔值return func(yield func(T) bool) {//初始化 e 为链表的头节点//循环条件为 e != nil//e = e.next 将e指向链表下一个节点for e := lst.head; e != nil; e = e.next {//调用yield,如果yield 返回 false,则退出循环,结束遍历if !yield(e.val) {return}}}
}// 斐波那契数列生成
// 定义函数genFib
// 输入参数没有
// 返回一个函数 int类型
func genFib() iter.Seq[int] {//返回一个匿名函数func,该匿名函数接受一个参数 yield,这个参数是一个函数类型,接受一个 int 类型的参数并返回一个布尔值。return func(yield func(int) bool) {//赋值a, b := 1, 1//调用yield,如果yield 返回 false,则退出循环for {if !yield(a) {return}a, b = b, a+b}}
}func main() {lst := List[int]{}lst.Push(10)lst.Push(13)lst.Push(23)for e := range lst.All() {fmt.Println(e)}//lst 是一个链表,调用 All() 方法会返回一个迭代器//这个生成器会遍历链表中的所有元素,并通过 yield 函数逐个返回这些元素。all := slices.Collect(lst.All()) //slices.Collect(...) 函数遍历生成器,收集所有元素fmt.Println("all:", all)//调用genFib,赋值给nfor n := range genFib() {//当n>=10跳出循环if n >= 10 {break}fmt.Println(n)}
}//输出
//10
//13
//23
//all: [10 13 23]
//1
//1
//2
//3
//5
//8
💡 Tips小知识点
迭代器和生成器
在 Go 语言中,生成器和迭代器是处理序列数据的两种不同概念,虽然它们有相似之处,但在实现和使用上有一些关键的区别。
- 生成器是一种函数,它可以逐步生成一系列值,而不是一次性返回所有值。生成器通常使用 yield 关键字(在 Go 中通常通过返回一个函数来模拟)来返回下一个值,并保持其状态,以便在下一次调用时继续执行。
- 生成器通常在需要时生成值,适用于需要惰性求值的场景。调用生成器时,可以获取下一个值,而不需要事先知道所有值。
- 生成器通过闭包保持状态,允许在多次调用之间保留局部变量的值。
- 迭代器是一种对象,它实现了特定的接口(通常包含 Next() 方法),用于遍历集合中的元素。迭代器维护一个内部状态,允许用户逐步访问集合的每个元素。
- 迭代器通常用于遍历整个集合,通过调用 Next() 方法来获取下一个元素,直到没有更多元素可供访问。
- 迭代器通过结构体的字段来管理状态,通常在结构体中维护当前元素的指针或索引。
生成器Example
func genFib() func() int {a, b := 0, 1return func() int {a, b = b, a+breturn a}
}
迭代器Example
type Iterator struct {current *Node
}func (it *Iterator) Next() *Node {if it.current == nil {return nil}node := it.currentit.current = it.current.nextreturn node
}
💪无人扶我青云志,我自踏雪至山巅。
相关文章:

【go从零单排】迭代器(Iterators)
🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 在 Go 语言中,迭代器的实现通常不是通过语言内置的迭代器类型&#x…...
Java与HTML:构建静态网页
在Web开发领域,HTML是构建网页的基础标记语言,而Java作为一种强大的编程语言,也能够在创建HTML内容方面发挥重要作用。今天,我们就来探讨一下如何使用Java来制作一个不那么简单的静态网页。 一、项目准备 首先,我们需…...

软件测试:测试用例详解
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、通用测试用例八要素 1、用例编号; 2、测试项目; 3、测试标题; 4、重要级别; 5、预置…...
FreeSWITCH Ubuntu 18.04 源码编译
应朋友邀请,试了试 FreeSWITCH Ubuntu 18.04 源码编译,交的作业如下: #!/bin/bash####### Ubuntu 18.04 LTS ####### ARM64 ####### FreeSWITCH 1.10.12apt update && \ apt install -y --fix-missing git sed bison build-essentia…...

spring—boot(整合redis)
整合redis 第一步导入数据源 <!--redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> RedisConfig(默认有RedisTemplate&#…...
Python 包镜像源
阿里云、清华大学和豆瓣之外,还有许多其他的 Python 包镜像源。下面是更新后的代码,增加了更多常用的镜像源,如华为云、腾讯云等 import tkinter as tk from tkinter import messagebox import os# 定义 pip 配置文件路径 pip_config_file …...

Sigrity SPEED2000 Power Ground Noise Simulation模式如何进行电源阻抗仿真分析操作指导(一)-无电容
Sigrity SPEED2000 Power Ground Noise Simulation模式如何进行电源阻抗仿真分析操作指导(一)-无电容 Sigrity Power Ground Noise Simulation模式同样可以用来观测电源网络的自阻抗,以下图为例进行说明 2D 视图 3D view 本例要观测的是U17端口处的自阻抗࿰…...
Unity3D ASTC贴图压缩格式详解
一、技术详解 ASTC(Adaptive Scalable Texture Compression)是一种先进的纹理压缩格式,特别适用于OpenGL ES 3.0及更高版本。ASTC在2012年推出,自那以后已经成为游戏开发中重要的纹理压缩技术。它不仅在iOS设备上得到广泛应用&am…...

Docker的轻量级可视化工具Portainer
docker目录 1 Portainer官方链接2 是什么?3 下载安装4 跑通一次5 后记 1 Portainer官方链接 这里给出portainer的官方链接:https://www.portainer.io/ portainer安装的官方链接:https://docs.portainer.io/start/install-ce/server/docker/l…...
udp丢包问题
udp或者tcp丢包问题监测方式: netstat -su 问题分析: 1. 内存 2. cpu 3. 发送接收缓存 动画图解 socket 缓冲区的那些事儿-CSDN博客...

儿童安全座椅行业全面深入分析
儿童安全座椅就是一种专为不同体重(或年龄段)的儿童设计,将孩子束缚在安全座椅内,能有效提高儿童乘车安全的座椅。欧洲强制性执行标准ECE R44/03的定义是:能够固定到机动车辆上,带有ISOFIX接口、LATCH接口的…...

【笔记】扩散模型(九):Imagen 理论与实现
论文链接:Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding 非官方实现:lucidrains/imagen-pytorch Imagen 是 Google Research 的文生图工作,这个工作并没有沿用 Stable Diffusion 的架构,而是级…...

05 SQL炼金术:深入探索与实战优化
文章目录 SQL炼金术:深入探索与实战优化一、SQL解析与执行计划1.1 获取执行计划1.2 解读执行计划 二、统计信息与执行上下文2.1 收集统计信息2.2 执行上下文 三、SQL优化工具与实战3.1 SQL Profile3.2 Hint3.3 Plan Baselines3.4 实战优化示例 SQL炼金术:…...
Linux用lvm格式挂载磁盘
Linux用lvm格式挂载磁盘 本次目标是将磁盘/dev/sdd以lvm格式挂载到/backup目录作为备份盘来用 1、查看当前磁盘 [rootquentin ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 300G 0 disk ├─sda1 8:1 0 1G…...

Xshell,Shell的相关介绍与Linux中的权限问题
目录 XShell的介绍 Shell的运行原理 Linux当中的权限问题 Linux权限的概念 Linux权限管理 文件访问者的分类(人) 文件类型和访问权限(事物属性) 文件权限值的表示方法 文件访问权限的相关设置方法 如何改变文件的访问权限…...

考研要求掌握的C语言(选择排序)
选择排序的特点 每次进行一趟排序后,就确定一个数据的最终位置 选择排序的原理 就是假设你是最小(最大数据)的下标,然后和其他进行比较,若发现还有比你还小(或还大)的数据,就更新…...

达梦8数据库适配ORACLE的8个参数
目录 1、概述 1.1 概述 1.2 实验环境 2、参数简介 3、实验部分 3.1 参数BLANK_PAD_MODE 3.2 参数COMPATIBLE_MODE 3.3 参数ORDER_BY_NULLS_FLAG 3.4 参数DATETIME_FMT_MODE 3.5 参数PL_SQLCODE_COMPATIBLE 3.6 参数CALC_AS_DECIMAL 3.7 参数ENABLE_PL_SYNONYM 3.8…...

CSS实现文字渐变效果
效果图: 代码: h1 {font-size: 100px;color:linear-gradient(gold,deeppink);background-image:linear-gradient( -gold, deeppink); /*春意盎然*///背景被裁剪成文字的前景色。background-clip:text;/*兼容内核版本较低的浏览器*/-webkit-background-c…...
3. Redis的通用命令介绍
Redis作为一个高效的键值对存储系统,不仅支持多种数据结构,还提供了丰富的通用命令,这些命令适用于各种场景。本文将详细介绍Redis的常用通用命令,并结合具体应用场景,帮助你理解这些命令的功能与使用时机。 1. 键(key…...
[spark面试]spark与mapreduce的区别---在DAG方面
1、spark中的task是以线程实现的,而mapreduce中是以进程实现的。 进程的频繁启动和停止会增加资源的消耗。 2、spark中支持DAG,而mapreduce不支持DAG DAG的使用:为什么支持DAG会更加高效 1)、在DAG图中,会将一个job…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...