作者:火立者 | 来源:互联网 | 2023-10-14 13:47
Go设计模式实现,包含常见的设计模式实现,同时这也是极客时间-设计模式之美的笔记,源课程采用Java实现,本系列会采用Go实现课程:65|迭代器模式(上):相比直接遍历集合数据,使
- Go 设计模式实现,包含常见的设计模式实现,同时这也是 极客时间-设计模式之美 的笔记,源课程采用 Java 实现,本系列会采用 Go 实现
- 课程: 65 | 迭代器模式(上):相比直接遍历集合数据,使用迭代器有哪些优势?
- 本文代码仓库: https://github.com/mohuishou/go-design-pattern :star2::star2::star2::star2::star2:
- RoadMap: 18/22 持续更新中,预计一周更新 2 ~ 3 种设计模式,预计到 202010 月底前更新完成
- 获取更新: Github 、 知乎 、 RSS 、 开发者头条 **
笔记
代码实现
下面是一个简单的自定义数组类型的例子
Code
package iterator
// Iterator 迭代器接口
type Iterator interface {
HasNext() bool
Next()
// 获取当前元素,由于 Go 1.15 中还没有泛型,所以我们直接返回 interface{}
CurrentItem() interface{}
}
// ArrayInt 数组
type ArrayInt []int
// Iterator 返回迭代器
func (a ArrayInt) Iterator() Iterator {
return &ArrayIntIterator{
arrayInt: a,
index: 0,
}
}
// ArrayIntIterator 数组迭代
type ArrayIntIterator struct {
arrayInt ArrayInt
index int
}
// HasNext 是否有下一个
func (iter *ArrayIntIterator) HasNext() bool {
return iter.index }
// Next 游标加一
func (iter *ArrayIntIterator) Next() {
iter.index++
}
// CurrentItem 获取当前元素
func (iter *ArrayIntIterator) CurrentItem() interface{} {
return iter.arrayInt[iter.index]
}
单元测试
package iterator
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestArrayInt_Iterator(t *testing.T) {
data := ArrayInt{1, 3, 5, 7, 8}
iterator := data.Iterator()
// i 用于测试
i := 0
for iterator.HasNext() {
assert.Equal(t, data[i], iterator.CurrentItem())
iterator.Next()
i++
}
}