首页 >后端开发 >Golang >在 Go 中创建迭代器的最佳方法是什么:通道、闭包或命名类型?

在 Go 中创建迭代器的最佳方法是什么:通道、闭包或命名类型?

Patricia Arquette
Patricia Arquette原创
2024-12-07 10:29:15769浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn