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

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

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-01 17:32:14436瀏覽

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

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