
在Go 中建立迭代器:通道、閉包與命名類型
在Go 中,存在多種建立迭代器的方法。一種流行的選擇是利用類似迭代器的通道。然而,通道受到限制,特別是作為推模型而不是拉模型,導致潛在的洩漏。
慣用的方法涉及使用閉包。以下範例示範如何建立用於產生偶數的迭代器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package main
import "fmt"
func main() {
gen := newEven()
fmt.Println(gen())
fmt.Println(gen())
fmt.Println(gen())
gen = nil
}
func newEven() func() int {
n := 0
return func() int {
n += 2
return n
}
}
|
登入後複製
另一個選項是將命名類型與方法一起使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 中連結迭代器很簡單。以下範例將偶數產生器與平方函數連結起來:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package main
import "fmt"
func main() {
gen := mapInt(newEven(), square)
fmt.Println(gen())
fmt.Println(gen())
fmt.Println(gen())
gen = nil
}
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中文網其他相關文章!