迭代器
- 标准库文档: https://pkg.go.dev/iter
注意
Go 版本必须大于 1.23 否则报错
迭代器是什么
迭代器(iterator)是 一个函数,它将序列中的连续元素传递给回调函数(通常命名为 yield),该函数在以下两种情况下停止:
- 序列迭代结束:所有元素都已传递完毕
yield返回false:调用者主动要求提前停止迭代
推式迭代器(Push Iterator) —— 迭代器主动将值"推送"给 yield 函数, 而非调用者主动"拉取"
go
// iter 包定义的核心类型
type (
Seq[V any] func(yield func(V) bool) // 单值迭代器
Seq2[K, V any] func(yield func(K, V) bool) // 双值迭代器(如 key-value)
)如何实现迭代器
加入我想要自定义一个数据结构(比如: Stack), 并且需要使他可以被遍历, 就需要实现迭代器协议, 让他返回一个迭代器函数, 用于 for range 遍历
go
package main
import (
"fmt"
"iter"
)
type Stack[T comparable] struct {
items []T
}
func (s *Stack[T]) Size() int {
return len(s.items)
}
func (s *Stack[T]) IsEmpty() bool {
return s.Size() == 0
}
func (s *Stack[T]) Push(item T) {
s.items = append(s.items, item)
}
func (s *Stack[T]) Pop() T {
if s.IsEmpty() {
return s.items[0]
}
lastIndex := len(s.items) - 1
s.items = s.items[:lastIndex]
return s.items[lastIndex]
}
func (n *Stack[T]) All() iter.Seq[T] {
// 返回一个迭代器函数 用于 for range 遍历整个栈
return func(yield func(T) bool) {
for _, item := range n.items {
if !yield(item) {
return
}
}
}
}
func main() {
s := Stack[int]{}
s.Push(1)
s.Push(3)
s.Push(5)
// All 方法返回一个迭代器函数
for item := range s.All() {
fmt.Println("item:", item)
}
}