首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Go1.23 迭代器所支持三个生成器函数

Go1.23 迭代器所支持三个生成器函数

作者头像
老麦
发布2025-06-10 14:02:38
发布2025-06-10 14:02:38
1150
举报
文章被收录于专栏:Go与云原生Go与云原生

Go1.23 迭代器所支持三个生成器函数

image

建议点击 查看原文 查看最新内容。

原文链接: https://typonotes.com/posts/2025/05/22/go1.23-iterators/

在 Go1.23 新引入了一个标准包 迭代器 Iterator[1] 。 可以返回一个 可迭代对象 - 函数该对象 接受一个 回调函数 - yield

标准包 iter 中包含以下两个类型 Seq, Seq2。 二者都返回了一个 生成器函数 yield function

代码语言:javascript
复制
type (
    Seq[V any]     func(yield func(V) bool)
    Seq2[K, V any] func(yield func(K, V) bool)
)

Seq2 的命名方式看起来很奇怪, 感觉不太符合 golang 的命名习惯。 这里推测 2 表示接受的回调有两个参数。 func(yield func(K, V) bool)

1. 标准库的迭代器

截至 go1.24 , 目前已经有 4个 标准包支持返回迭代器了。

  • slices, maps: https://tip.golang.org/doc/go1.23#iterators
  • strings: https://tip.golang.org/doc/go1.24#stringspkgstrings
  • bytes: https://tip.golang.org/doc/go1.24#bytespkgbytes

这个没什么好说的, 直接看文档就行了。

2. 迭代器对象的使用

迭代器的两种使用方式 回调函数for 循环。

  1. 使用 回调函数 时, 可以通过 return false 提前终止遍历。
  2. 使用 for 循环时
    • Seq 返回的对象是 , 类似于 for _, v := range []int{1,2,3} 中的 v
    • Seq2 返回的对象是 键、值。 普通的 for 循环类似。
代码语言:javascript
复制
// Seq
l := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
it1 := slices.Values(l)

for v := range it1 {  // Seq 返回的是 v
    println(v)
}


call1 := func(v int) bool {
    if v > 5 {
        returnfalse// false 提前退出
    }
    fmt.Println(v)
    returntrue
}
it1(call1) // 1,2,3,4,5



// Seq2
m := map[string]string{
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
}

it2 := maps.All(m)
for k, v := range it2 {  // Seq2 返回的是 k, v
    println(k, v)
}

call2 := func(k, v string) bool {
    if k == "key2" {
        returnfalse
    }

    println(k, v)
    returntrue
}

it2(call2)

3. 第三类生成器函数

Go1.23 的 Release Notes[2] 中提到的 无参数迭代对象, 并没有在标准包中找到。

代码语言:javascript
复制
func(func() bool) // 无参数 <---


func(func(K) bool)  // Seq: 1 参数
func(func(K, V) bool) // Seq2: 2 参数

目前我这边没想到有什么使用场景, 从语法上来看, 配合 柯里化函数通道 等手段, 还是有操作性的。

代码语言:javascript
复制
// currylock 返回了一个自身计数的迭代器
func currylock() func() bool {

    n := 3
    i := 1
    returnfunc() bool {
        println(i, "<", n)
        i++
        if i > n {
            returnfalse
        }
        returntrue
    }
}

func seq0() {
    it0 := currylock()

    for it0() {  // 调用的时候就像死循环。
                 // 其实感觉有没什么特别的。
                 // 就是 `for bool {}` 的模式。
    }
    // 1 < 3
    // 2 < 3
    // 3 < 3
}

4. 扩展阅读

  1. Range Over Function Types - https://go.dev/blog/range-functions

互相吹捧, 共同进步

参考资料

[1]

迭代器 Iterator: https://tip.golang.org/doc/go1.23#iterators

[2]

Go1.23 的 Release Notes: https://tip.golang.org/doc/go1.23#language

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 熊猫云原生Go 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Go1.23 迭代器所支持三个生成器函数
    • 1. 标准库的迭代器
    • 2. 迭代器对象的使用
    • 3. 第三类生成器函数
    • 4. 扩展阅读
    • 互相吹捧, 共同进步
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档