首页 >后端开发 >Golang >在 Go 中创建迭代器最惯用的方法是什么?

在 Go 中创建迭代器最惯用的方法是什么?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-01 17:32:14434浏览

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