首页 > 其他分享 >golang中用chan实现迭代器

golang中用chan实现迭代器

时间:2024-06-18 10:55:24浏览次数:20  
标签:index 迭代 ListStruct int chan golang func sl data

实现代码如下:

package main

import (
	"log"
	"time"
)

/*
	两种迭代器的实现
*/

// 采用index的方式实现(非线程安全)
type ListStruct struct {
	index int
	data  []int
}

func (sl *ListStruct) Next() int {
	d := sl.data[sl.index]
	sl.index += 1
	return d
}

func (sl *ListStruct) HasNext() bool {
	return sl.index < len(sl.data)
}

// 采用channel的方式实现
type ListType []int

func Iterator(s ListType) <-chan int {
	c := make(chan int)
	go func() {
		for _, a := range s {
			c <- a * a
		}
		close(c)
	}()
	return c
}

func main() {
	sl := ListStruct{data: []int{1, 2, 3, 4, 5}}
	for sl.HasNext() {
		log.Println(sl.Next())
	}

	s := []int{1, 2, 3, 4, 5}
	var c <-chan int

	// 使用原有数据集进行遍历(不推荐)
	c = Iterator(s)
	for i := 0; i < len(s); i++ {
		a := <-c
		log.Println(a)
		<-time.After(time.Millisecond * 10)
	}

	// 采用迭代器本身遍历(注意这里的range参数为c,而不是<-c)
	c = Iterator(s)
	for a := range c {
		log.Println(a)
		<-time.After(time.Millisecond * 10)
	}

	// 采用迭代器本身遍历(注意这里的ok判断chan结束与否)
	c = Iterator(s)
	for {
		a, ok := <-c
		if !ok {
			break
		}
		log.Println(a)
		<-time.After(time.Millisecond * 10)
	}
}

标签:index,迭代,ListStruct,int,chan,golang,func,sl,data
From: https://www.cnblogs.com/zongzw/p/18253910

相关文章

  • rust 和 golang 的特点及适用场景
     Rust特点及适用场景:内存安全:Rust通过所有权系统和生命周期管理在编译时保证内存安全,有效防止了空指针异常、数据竞争、悬挂指针等问题,非常适合开发高性能系统软件和底层库。并发模型:Rust提供了强大的并发工具,如async/await和通道(channel),支持高效且安全......
  • golang flag 包
    Go语言的flag包用于命令行参数的解析。你可以通过定义参数来使用它。以下是一些使用flag包的常见方法:使用flag.String()定义一个字符串参数。使用flag.Int()定义一个整数参数。使用flag.Parse()解析命令行参数。使用flag.Args()获取未解析的参数。以下是一个简单的示例,演......
  • Python中的迭代器与生成器
    目录一、引言二、迭代器(Iterator)迭代器的概念迭代器的使用三、生成器(Generator)生成器的概念生成器的使用四、迭代器与生成器的性能与内存优化性能优化内存优化五、案例分析六、进阶用法推导式(Comprehensions)生成器表达式(GeneratorExpressions)七、总结一、引......
  • [YOLOv10涨点改进:注意力魔改 | 轻量级的 Mixed Local Channel Attention (MLCA),加强通
    本文属于原创独家改进:一种轻量级的MixedLocalChannelAttention(MLCA)模块,该模块考虑通道信息和空间信息,并结合局部信息和全局信息以提高网络的表达效果1.YOLOv10介绍论文:[https://arxiv.org/pdf/2405.14458]代码:https://gitcode.com/THU-MIG/yolov10?utm_source=c......
  • 【四种语言一网打尽(C\C++\Python\Golang)】L1-012 计算指数
    L1-012计算指数真的没骗你,这道才是简单题——对任意给定的不超过10的正整数n,要求你输出2^n。不难吧?输入格式:输入在一行中给出一个不超过10的正整数n。输出格式:在一行中按照格式2^n=计算结果输出2^n的值。输入样例:5输出样例:2^5=32C语言参考......
  • 【四种语言一网打尽(C\C++\Python\Golang)】L1-009 N个数求和
    L1-009N个数求和本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。输入格式:输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1a2/b2…给出N个有理数。题目保证所有分子和分母都在长整型范围......
  • 使用expected_conditions的url_changes方法判断是否登录成功
    使用expected_conditions的url_changes方法判断是否跳转页面登录成功fromseleniumimportwebdriverfromselenium.webdriver.supportimportexpected_conditionsasecfromselenium.webdriver.support.waitimportWebDriverWaitdeflogin():driver=webdrive......
  • [C++] vector && list 等容器的迭代器失效问题
    标题:[C++]容器的迭代器失效问题@水墨不写bug正文开始:什么是迭代器?    迭代器是STL提供的六大组件之一,它允许我们访问容器(如vector、list、set等)中的元素,同时提供一个遍历容器的方法。然而,在使用迭代器时,我们必须注意所谓的“迭代器失效”问题。一、插入/删......
  • Ubuntu安装Golang环境
    一、安装使用apt安装更新包列表:sudoaptupdate**安装Golang**:sudoaptinstallgolang验证安装:执行以下命令来检查是否成功安装了Go:goversion输出结果:goversiongo1.21.1linux/amd64二、配置环境设置GOPATH环境变量(可选,但建议):GOPATH是Go......
  • golang 所有关键字的列表及释义归类
    golang所有关键字的列表及释义归类,截至1.18版本。 [控制结构]if :条件语句,基于布尔表达式的值决定是否执行特定的代码块。else、elseif   :用在if语句之后,当条件表达式为假时执行的代码块。switch:多路选择语句,根据不同的情况执行不同......