在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中文網其他相關文章!