17. 迭代器模式(Iterator)

问题:想统一遍历不同数据结构,不暴露内部实现。

核心:提供 next() 方法,依次返回元素直到结束。

class NumberIterator {
  #data;
  #index = 0;
  constructor(data) { this.#data = data; }
  next() {
    if (this.#index < this.#data.length) {
      return { value: this.#data[this.#index++], done: false };
    }
    return { value: undefined, done: true };
  }
}

const iter = new NumberIterator([10, 20, 30]);
let result;
while (!(result = iter.next()).done) {
  console.log(result.value);
}
// 10 → 20 → 30
package iterator

import "fmt"

type Iterator[T any] struct {
  data   []T
  cursor int
}

func NewIterator[T any](data []T) *Iterator[T] {
  return &Iterator[T]{data: data}
}

func (it *Iterator[T]) Next() (T, bool) {
  var zero T
  if it.cursor >= len(it.data) {
    return zero, false
  }
  val := it.data[it.cursor]
  it.cursor++
  return val, true
}

// 使用
// iter := NewIterator([]int{10, 20, 30})
// for {
//   val, ok := iter.Next()
//   if !ok { break }
//   fmt.Println(val)
// }

JS 的 for...ofArray.prototype[Symbol.iterator]、生成器函数就是语言内置的迭代器模式。