go实现一个切片迭代器

go实现一个简单的切片迭代器

package main

import "fmt"

type iterator struct {
	data  []int
	index int // 索引
}

// 通过简单工厂函数构造一个实例对象
func newIterator(data []int) *iterator {
	return &iterator{data: data}
}

// 判断迭代器是否能迭代
func (iter *iterator) HasNext() bool {
	if iter.data == nil || len(iter.data) == 0 {
		return false
	}
	return iter.index < len(iter.data)
}

// 迭代器迭代数据
func (iter *iterator) Next() int {
	defer func() {
		iter.index++
	}() // 延時函數在Next函數調用結束後執行defer函數
	return iter.data[iter.index]
	//iter.index++
}

func main() {
	ints := []int{1, 2, 3, 4, 5}
	iterator := newIterator(ints)
	for iterator.HasNext() {
		fmt.Println(iterator.Next())
	}
}

切片迭代器(2):支持多类型和封装

说白了就是把一些公共的提取出来封装成对象,这里把上面中的index提取出来,以及切片长度还有判断是否还能迭代的方法提取出来 放在iterator中

image

package iterator

type Iterator struct {
	index int // 索引
	len   int // 切片长度
}

func (iter *Iterator) HasNext() bool { // 判断切片是否已取完
	if iter.len == 0 {
		return false
	}
	return iter.index < iter.len //索引长度一定小于切片长度
}

写支持int类型切片的迭代器

image

package iterator

type IntIterator struct {
	*Iterator
	data []int
}

func InterForInt(data []int) *IntIterator {
	return &IntIterator{Iterator: &Iterator{len: len(data)}, data: data}
}

func (iter *IntIterator) Next() int {
	defer func() {
		iter.index++
	}() // 延時函數在Next函數調用結束後執行defer函數
	return iter.data[iter.index]
	//iter.index++
}

写支持strings类型切片的迭代器

image

package iterator

type StrIterator struct {
	*Iterator
	data []string
}

func IterForStr(data []string) *StrIterator {
	return &StrIterator{Iterator: &Iterator{len: len(data)}, data: data}
}

func (siter *StrIterator) Next() string {
	defer func() {
		siter.index++
	}()
	return siter.data[siter.index]
}

posted @   流走在黑夜深巷的猫  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示