Skip to content

迭代器

注意

Go 版本必须大于 1.23 否则报错

迭代器是什么

迭代器(iterator)是 一个函数,它将序列中的连续元素传递给回调函数(通常命名为 yield),该函数在以下两种情况下停止:

  1. 序列迭代结束:所有元素都已传递完毕
  2. 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)
	}
}

Released under the MIT License.