【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
}

💪无人扶我青云志,我自踏雪至山巅。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/468209.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot和Vue的公司文档管理系统设计与开发(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

使用vite构建一个react网站,并部署到Netlify上

这篇教程中&#xff0c;我会教你如何用vite快速构建一个react网站&#xff0c;并把网站免费部署到Netlify上&#xff0c;让别人可以经由网址访问你的react网站。 1. 使用vite构建基础框架 npm create vitelatestcd vite-project npm install npm run dev2. 网站内容设计 3. 构…

青藤深度参编的终端安全国家标准正式发布

近日&#xff0c;国家市场监督管理总局、国家标准化管理委员会发布中华人民共和国国家标准公告&#xff0c;由TC260&#xff08;全国网络安全标准化技术委员会&#xff09;归口&#xff0c;公安部第三研究所牵头的GB/T 29240-2024《网络安全技术 终端计算机通用安全技术规范》&…

Python爬虫如何处理验证码与登录

Python爬虫如何处理验证码与登录 Python 爬虫在抓取需要登录的网站数据时&#xff0c;通常会遇到两个主要问题&#xff1a;登录验证和验证码处理。这些机制是网站用来防止自动化程序过度抓取数据的主要手段。本文将详细讲解如何使用 Python 处理登录与验证码&#xff0c;以便进…

Stream流(JAVA笔记第三十三期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 Stream流的使用步骤获取Stream流Stream流的中间方法Stream中的终结方法收集方法collect Stream流可以比作工厂的流水线 Stream流的概念 Stream流的使用步骤 先得到一条Stream流(…

基于python深度学习技术矩阵分解的推荐系统,通过学习隐含特征,实现推荐

实现了一个基于矩阵分解的推荐系统&#xff0c;用于预测用户对电影的评分。具体来说&#xff0c;该程序通过TensorFlow构建和训练一个模型&#xff0c;来学习用户和电影之间的隐含特征&#xff0c;并根据这些特征预测评分。以下是代码的主要功能和步骤的详细描述&#xff1a; …

Python学习从0到1 day27 第三阶段 Spark ③ 数据计算 Ⅱ

目录 一、Filter方法 功能 语法 代码 总结 filter算子 二、distinct方法 功能 语法 代码 总结 distinct算子 三、SortBy方法 功能 语法 代码 总结 sortBy算子 四、数据计算练习 需求&#xff1a; 解答 总结 去重函数&#xff1a; 过滤函数&#xff1a; 转换函数&#xff1a; 排…

「Mac玩转仓颉内测版2」入门篇2 - 编写第一个Cangjie程序

本篇详细介绍在Mac系统上创建首个Cangjie项目并编写、运行第一个Cangjie程序的全过程。内容涵盖项目创建、代码编写、程序运行与调试&#xff0c;以及代码修改后的重新运行。通过本篇&#xff0c;掌握Cangjie项目的基本操作&#xff0c;进一步巩固开发环境的配置&#xff0c;迈…

[Docker#2] 发展历史 | Namespace环境隔离 | Cgroup资源控制

目录 1.发展历史 Jail 时代 云时代 云原生时代 技术标准的确立 虚拟机 vs Docker 2. 容器化技术 2.1 Namespace 命令详解 1. dd 命令 2. mkfs 命令 3. df 命令 4. mount 命令 5. unshare 命令 实战 进程隔离 文件隔离 2.2 CGroup 相关命令 2.1 pidstat 2.…

计算机网络:网络层 —— 软件定义网络 SDN

文章目录 软件定义网络 SDN远程控制器OpenFlow协议SDN 广义转发流表简单转发负载均衡防火墙 SDN 控制器 软件定义网络 SDN 软件定义网络&#xff08;Software Defined Networking&#xff0c;SDN&#xff09;是一种新兴的网络架构&#xff0c;旨在通过网络控制与数据转发的分离…

高通Quick板上安装编译Ros1 noetic,LeGO_LOAM,FAR_Planner和rslidar_sdk

环境要求&#xff1a; 这里quick板上安装的是Ubuntu20.04版本 Ros Noeti安装&#xff1a; 1.设置软件源&#xff1a; 官方提供的软件源&#xff1a; sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.…

「QT」几何数据类 之 QPointF 浮点型点类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

如何处理模型的过拟合和欠拟合问题

好久没有写人工智能这块的东西了&#xff0c;今天正好在家休息&#xff0c;给大家分享一下最近在训练时遇到的过拟合和欠拟合的问题&#xff0c;经过仔细的思考&#xff0c;总结如下&#xff1a; 在处理模型的过拟合和欠拟合问题时&#xff0c;我们需要根据具体情况采取不同的…

GoLang协程Goroutiney原理与GMP模型详解

本文原文地址:GoLang协程Goroutiney原理与GMP模型详解 什么是goroutine Goroutine是Go语言中的一种轻量级线程&#xff0c;也成为协程&#xff0c;由Go运行时管理。它是Go语言并发编程的核心概念之一。Goroutine的设计使得在Go中实现并发编程变得非常简单和高效。 以下是一些…

“穿梭于容器之间:C++ STL迭代器的艺术之旅”

引言&#xff1a; 迭代器&#xff08;Iterator&#xff09;是C STL&#xff08;标准模板库&#xff09;中非常重要的一部分&#xff0c;它提供了一种统一的方式来遍历容器中的元素。无论容器是数组、链表、树还是其他数据结构&#xff0c;迭代器都能够以一致的方式访问这些数据…

opencv实时弯道检测

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

智谱AI视频生成模型CogVideoX v1.5开源 支持5/10秒视频生成

今日&#xff0c;智谱技术团队发布了其最新的视频生成模型 CogVideoX v1.5&#xff0c;并将其开源。这一版本是自8月以来&#xff0c;智谱技术团队推出的 CogVideoX 系列中的又一重要进展。 据了解&#xff0c;此次更新大幅提升了视频生成能力&#xff0c;包括支持5秒和10秒的视…

Python注意力机制Attention下CNN-LSTM-ARIMA混合模型预测中国银行股票价格|附数据代码...

全文链接&#xff1a;https://tecdat.cn/?p38195 股票市场在经济发展中占据重要地位。由于股票的高回报特性&#xff0c;股票市场吸引了越来越多机构和投资者的关注。然而&#xff0c;由于股票市场的复杂波动性&#xff0c;有时会给机构或投资者带来巨大损失。考虑到股票市场的…

【Pikachu】File Inclusion文件包含实战

永远也不要忘记能够笑的坚强&#xff0c;就算受伤&#xff0c;我也从不彷徨。 1.File Inclusion(文件包含漏洞)概述 File Inclusion(文件包含漏洞)概述 文件包含&#xff0c;是一个功能。在各种开发语言中都提供了内置的文件包含函数&#xff0c;其可以使开发人员在一个代码…

数据结构:跳表实现(C++)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言跳表跳表的优化思路skiplist&#xff0c;平衡搜索树&#xff0c;哈希表的对比 实现思路SkiplistNodesearch 搜索add 增加earse 删除 整体…