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

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

```go
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) {
                return
            }
        }
        return
    }
}

func main() {
    sl := []string{"hello", "world", "golang"}
    for i, s := range Backward(sl) {
        fmt.Printf("%d : %s\n", i, s)
    }
}
```

`Backward`这个函数这形式看起来还真有点复杂,不好理解。。。。可能例子不是相应场景下需要的,看半天没理解。
感觉一般都用不上。
举报· 927 次点击
登录 注册 站外分享
64 条回复  
BBCCBB 小成 2024-8-19 10:37:17
python 里的生成器? 不过 python 不需要 fn 里再套一个 fn.
Leviathann 初学 2024-8-19 10:43:29
这语法笑死
go 在探索下限这点上上限很高
lysShub 小成 2024-8-19 10:44:06
可不要要写这种垃圾代码,这特性怎么通过的的,太傻逼了
sagaxu 初学 2024-8-19 10:47:41
大道至简没能一以贯之啊,特性越加越多,以后不敢说看 Go 代码时语言层面的心智负担低了
wunonglin 小成 2024-8-19 10:50:07
就是迭代器。和 js 里的 yield 差不多,但是语法真的难看
ZxykM 小成 2024-8-19 10:51:08
我不敢相信这特性怎么通过的?写法也太丑了
body007 初学 2024-8-19 10:55:57
我喜欢 go ,但我讨厌这个特性。主要场景也不是你上面那种封装完立即 range 遍历,而是生成一个迭代器,放到代码其他位置去遍历,这种代码容易写出 bug ,还不好定位。你可以看下 iter 包,里面还有 iter.Pull 这种方法,就是把迭代器变成 next() 和 stop() 两个函数,意思是在其他代码位置一个个读取迭代器元素,最好在最上面写 defer stop()。go 容易阅读是很多使用者喜欢的原因,难以想象到处充斥这种迭代器的代码的阅读体验。生成迭代器和使用迭代器的代码位置可能相差十万八千里,调试打断点估计都不好找位置🤣
zhuangzhuang1988 小成 2024-8-19 10:56:40
JS 也会这样写
Quill.js 编辑器的代码
https://github.com/slab/parchment/blob/main/src/collection/linked-list.ts#L117
PTLin 小成 2024-8-19 11:01:25
看来不止我一个觉得丑,之前在一个群喷这个语法,一个大佬搬出了一堆文章和 x 上的博客证明这个 push 的迭代器多么先进。
返回顶部