Go中的迭代器模式
迭代器模式是一種設計模式,它允許你遍歷集合中的元素,而無需公開集合的底層表示。在 Go 中,有幾種方法可以建立迭代器。
通道
通道是一種類似迭代器的資料結構。你可以使用 range 關鍵字在頻道上進行迭代。然而,當發現無法在不洩漏 goroutine 的情況下中止此循環時,其用法就會受到限制。
閉包
閉包通常比通道更適合建立迭代器。它允許你捕獲變數並創建狀態在每次呼叫之間保持不變的函數。你可以使用閉包來建立產生值的迭代器。
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) }
鍊式迭代器
在 Go 中,鍊式迭代器很容易實現,因為函數是一等物件。你可以使用類似 map 和 filter 的函數來映射或過濾迭代器值。
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中文網其他相關文章!