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

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

Patricia Arquette
发布: 2024-12-07 10:29:15
原创
721 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板