首頁 >後端開發 >Golang >在 Go 中建立迭代器的最佳方法是什麼:通道、閉包或命名類型?

在 Go 中建立迭代器的最佳方法是什麼:通道、閉包或命名類型?

Patricia Arquette
Patricia Arquette原創
2024-12-07 10:29:15768瀏覽

What's the Best Way to Create Iterators in Go: Channels, Closures, or Named Types?

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn