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