V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
dyllen
V2EX  ›  Go 编程语言

go 新特性 range over func 没怎么看懂。。。。写库的时候用吗?

  •  
  •   dyllen · 30 天前 · 7677 次点击

    go1.23 新的正式特性 range over func 看了下没怎么看懂。。。

    for range 返回一个函数,函数里面还是 for range 或者就 for 循环:

    func Backward[E any](s []E) func(func(int, E) bool) {
        return func(yield func(int, E) bool) {
            for i := len(s) - 1; i >= 0; i-- {
                if !yield(i, s[i]) {
                    return
                }
            }
            return
        }
    }
    
    func main() {
        sl := []string{"hello", "world", "golang"}
        for i, s := range Backward(sl) {
            fmt.Printf("%d : %s\n", i, s)
        }
    }
    

    Backward这个函数这形式看起来还真有点复杂,不好理解。。。。可能例子不是相应场景下需要的,看半天没理解。 感觉一般都用不上。

    第 1 条附言  ·  29 天前
    示例是从一个博客文章里面复制的
    第 2 条附言  ·  28 天前
    一时没看出来 yield 就是函数类型参数变量的名称,一眼看以为是啥关键字..... 测试了下,每次执行到 yield(x,x)的时候就会返回值给 range 输出,接着继续执行 yield(x,x)后面的代码行。
    104 条回复    2024-08-20 16:57:46 +08:00
    1  2  
    june4
        101
    june4  
       30 天前
    @xz410236056 其它语言也都有生成器,比如 js 也有生成器协议,但人家同时还有 yield 语法糖可以掩盖底下丑陋的协议,用起来象 return 一样简单可读,没人会直接用原始协议的格式来写生成器,太丑了。
    dyllen
        102
    dyllen  
    OP
       29 天前
    @voidmnwzp 不是官方示例,我在别人博客复制的。
    allenby
        103
    allenby  
       29 天前 via Android
    看着像是在循环的时候返回本身和索引
    lveye
        104
    lveye  
       29 天前
    官方的例子是这个 https://go.dev/wiki/RangefuncExperiment ,一样的东西。看着还挺不错,满足这 2 个一级函数就可以进行 for range 。

    type Seq[V any] func(yield func(V) bool)

    type Seq2[K, V any] func(yield func(K, V) bool)
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5845 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 02:12 · PVG 10:12 · LAX 19:12 · JFK 22:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.