在 Go 中创建迭代器:通道、闭包与命名类型
在 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 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 中创建迭代器的最佳方法是什么:通道、闭包或命名类型?的详细内容。更多信息请关注PHP中文网其他相关文章!