首頁 > 後端開發 > Golang > 在 Go 中建立迭代器最慣用的方法是什麼?

在 Go 中建立迭代器最慣用的方法是什麼?

Mary-Kate Olsen
發布: 2024-12-01 17:32:14
原創
490 人瀏覽過

What's the Most Idiomatic Way to Create Iterators in Go?

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

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