首頁 > 後端開發 > Golang > 如何在 Go 中建立慣用的迭代器?

如何在 Go 中建立慣用的迭代器?

Linda Hamilton
發布: 2024-12-06 16:13:15
原創
591 人瀏覽過

How to Create Idiomatic Iterators in Go?

在 Go 中建立慣用迭代器

迭代器對於以方便且富有表現力的方式迭代集合至關重要。雖然通道最初看起來像是一個可行的選擇,但它們的推送模型和記憶體洩漏問題限制了它們的實用性。

慣用方法

閉包:

閉包提供了一個簡單的方法來實作迭代器。透過捕獲函數內的變量,該函數可以用作迭代器,每次呼叫都會遞增該變數並傳回其值。例如:

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板