Go 中的迭代器 — Bitfield 咨询

主要观点:Golang 的迭代器是每次“产出”一个结果的函数,替代一次性计算并返回所有结果。for循环中range表达式为迭代器时,会为迭代器返回的每个值执行一次。迭代器很有用,能避免一次性生成和处理整个切片,减少内存分配和浪费。

关键信息

  • 迭代器函数签名:func (yield func(Item) bool),通过yield函数产出值,全部产出后返回表示迭代完成。
  • 单值迭代器iter.Seq:如func Items() iter.Seq[Item],返回一个可迭代的Item序列。
  • 双值迭代器iter.Seq2:签名为func (int, Item) bool,可同时产出索引和值,如func Items() iter.Seq2[int, Item]
  • 处理错误:可通过iter.Seq2返回值和错误,调用者需检查错误。
  • 清理资源:yield返回false可作为清理资源的信号。
  • 组合迭代器:可编写接受和返回迭代器的函数,如func PrintAll[V any](seq iter.Seq[V])
  • 与通道对比:迭代器在避免并发问题和处理循环提前退出方面更友好,而通道在并发编程中有其他优势。
  • 标准库变化:slicesmaps包新增返回迭代器的函数,如slices.Allslices.Values等。

重要细节

  • 示例中Items函数通过生成Item切片并在for循环中通过yield产出每个值来实现迭代器。
  • 当需要索引时,双值迭代器可满足需求,如for i, v := range Items()
  • 迭代器在处理读取io.Readerbufio.Scanner等可能出错的情况时,可通过返回值和错误来处理。
  • 标准库中for i, v := range slices.All(s)可遍历切片的索引和值,for v := range slices.Values(s)可只遍历值。对于map也有类似的遍历函数。
阅读 11
0 条评论