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中
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类型切片的迭代器
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类型切片的迭代器
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]
}
分类:
go / go的一些简单实现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具