前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go 1.23 的迭代器是什么?

Go 1.23 的迭代器是什么?

作者头像
frank.
发布于 2024-11-19 07:56:53
发布于 2024-11-19 07:56:53
15000
代码可运行
举报
运行总次数:0
代码可运行

大家好,我是 frank,「Golang语言开发栈」公众号作者。

01 、介绍

在 Go 1.23 版本中,新引入迭代器功能,这是一个新的语言特性,旨在简化对集合和其他数据结构的迭代操作。迭代器提供了一种更直接、更灵活的方式来遍历集合,同时避免了传统方法中的一些局限性,例如通道的性能开销和复杂性。

本文我们介绍 Go 1.23 中迭代器的使用方式。

02 、迭代器实现原理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Range expression                                          1st value                2nd value

function, 0 values  f  func(func() bool)
function, 1 value   f  func(func(V) bool)              value    v  V
function, 2 values  f  func(func(K, V) bool)         key      k  K            v          V

For a function f, the iteration proceeds by calling f with a new, synthesized yield function as its argument. If yield is called before f returns, the arguments to yield become the iteration values for executing the loop body once. After each successive loop iteration, yield returns true and may be called again to continue the loop. As long as the loop body does not terminate, the "range" clause will continue to generate iteration values this way for each yield call until f returns. If the loop body terminates (such as by a break statement), yield returns false and must not be called again.

03 、迭代器使用方式‍‍‍‍‍

迭代器函数通常由 for range 调用,示例代码:

// 迭代器 func(func() bool)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

// 迭代器
func f0(yield func() bool) {
    for i := 0; i < 10; i++ {
        if !yield() {
            return
        }
    }
}

func main() {
    for range f0 {
        fmt.Println("iter")
    }
}

// 迭代器 f func(func(V) bool)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func f1(yield func(k int) bool) {
    for i := 0; i < 10; i++ {
        if !yield(i) {
            return
        }
    }
}

func main() {
    for k := range f1 {
        fmt.Println(k)
    }
}

// 迭代器 f func(func(K, V) bool)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

// 迭代器
func f2(yield func(k int, v string) bool) {
    for i := 0; i < 10; i++ {
        if !yield(i, fmt.Sprintf("No.%d", i)) {
            return
        }
    }
}

func main() {
    for k, v := range f2 {
        fmt.Printf("k:%d, v:%s\n", k, v)
    }
}

// 迭代器 break

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func f2(yield func(k int, v string) bool) {
    for i := 0; i < 10; i++ {
        if !yield(i, fmt.Sprintf("No.%d", i)) {
            return
        }
    }
}

func main() {
    for k, v := range f2 {
        if k == 5 {
            fmt.Println("iter break")
            break
        }
        fmt.Printf("k:%d, v:%s\n", k, v)
    }
}

04 、总结

本文我们主要通过示例代码,介绍 Go 1.23 引入的语言新特性迭代器怎么使用,感兴趣的读者朋友们,不妨在本地运行示例代码,举一反三,思考一下有哪些使用场景。

参考资料:

  1. https://pkg.go.dev/iter
  2. https://tip.golang.org/wiki/RangefuncExperiment
  3. https://tip.golang.org/ref/spec#For_statements

动动发财的小手,点赞和在看。

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

本文分享自 Golang语言开发栈 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档