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

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

Patricia Arquette
發布: 2024-12-07 10:29:15
原創
723 人瀏覽過

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

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