在 Go 中构造迭代器的惯用方式
通道提供了类似通道的迭代机制。虽然它们有局限性,例如无法在不冒 goroutine 泄漏风险的情况下突破迭代,但它们并不是在 Go 中创建迭代器模式的惯用方法。为此,闭包更合适。
package main import "fmt" func main() { gen := newEven() fmt.Println(gen()) fmt.Println(gen()) fmt.Println(gen()) gen = nil // release for garbage collection } func newEven() func() int { n := 0 // closure captures variable n return func() int { n += 2 return n } }
另一种选择是在方法中使用命名类型。
package main import "fmt" func main() { gen := even(0) fmt.Println(gen.next()) fmt.Println(gen.next()) fmt.Println(gen.next()) } type even int func (e *even) next() int { *e += 2 return int(*e) }
由于 Go 的一流函数,链接生成器很简单。下面是一个示例:
package main import "fmt" func main() { gen := mapInt(newEven(), square) fmt.Println(gen()) fmt.Println(gen()) fmt.Println(gen()) gen = nil // release for garbage collection } type intGen func() int func newEven() intGen { n := 0 return func() int { n += 2 return n } } func mapInt(g intGen, f func(int) int) intGen { return func() int { return f(g()) } } func square(i int) int { return i * i }
总之,虽然 Go 中有多种创建迭代器的技术,但惯用的方法涉及闭包或带有方法的命名类型。这些之间的选择取决于特定的需求和权衡。
以上是在 Go 中创建迭代器最惯用的方法是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!