迭代器對於以方便且富有表現力的方式迭代集合至關重要。雖然通道最初看起來像是一個可行的選擇,但它們的推送模型和記憶體洩漏問題限制了它們的實用性。
閉包:
閉包提供了一個簡單的方法來實作迭代器。透過捕獲函數內的變量,該函數可以用作迭代器,每次呼叫都會遞增該變數並傳回其值。例如:
import "fmt" func newEven() func() int { n := 0 return func() int { n += 2 return n } }
帶有方法的命名類型:
另一種方法是使用迭代集合的方法來定義命名類型。此方法可以更新其內部狀態並傳回序列中的下一個元素。例如:
type even int func (e *even) next() int { *e += 2 return int(*e) }
權衡和選擇:
方法的選擇取決於特定要求。通道非常適合並發場景,閉包提供靈活性和易用性,而命名類型提供清晰度和封裝性。
函數式程式設計概念可用於連結多個迭代器以進行複雜的轉換。函數可以組合成迭代器,從而可以進行映射、過濾和折疊等操作。
這是使用閉包連結迭代器的範例:
import "fmt" 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 } func main() { gen := mapInt(newEven(), square) fmt.Println(gen()) fmt.Println(gen()) fmt.Println(gen()) }
利用Go 的靈活性和可擴展性函數類型、迭代器可以輕鬆組合以有效地轉換和處理集合。
以上是如何在 Go 中建立慣用的迭代器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!