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