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

83 天前
 dyllen

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

8855 次点击
所在节点    Go 编程语言
105 条回复
BBCCBB
83 天前
python 里的生成器? 不过 python 不需要 fn 里再套一个 fn.
dyllen
83 天前
@BBCCBB 所以看起来有点费解,迭代器,应该是一种东西。
Leviathann
83 天前
这语法笑死
go 在探索下限这点上上限很高
lysShub
83 天前
可不要要写这种垃圾代码,这特性怎么通过的的,太傻逼了
sagaxu
83 天前
大道至简没能一以贯之啊,特性越加越多,以后不敢说看 Go 代码时语言层面的心智负担低了
dyllen
83 天前
迭代器是一个函数,它将一个序列中的连续元素传递给一个回调函数,通常称为"yield"。迭代器函数会在序列结束或者 yield 回调函数返回 false(表示提前停止迭代)时停止。
wunonglin
83 天前
就是迭代器。和 js 里的 yield 差不多,但是语法真的难看
ZxykM
83 天前
我不敢相信这特性怎么通过的?写法也太丑了
dyllen
83 天前
@wunonglin 说实话,其他语言的语法更好理解
dyllen
83 天前
@ZxykM 这个就是那个 rsc 自己提的提案,能不通过吗? https://github.com/golang/go/issues/61405
body007
83 天前
我喜欢 go ,但我讨厌这个特性。主要场景也不是你上面那种封装完立即 range 遍历,而是生成一个迭代器,放到代码其他位置去遍历,这种代码容易写出 bug ,还不好定位。你可以看下 iter 包,里面还有 iter.Pull 这种方法,就是把迭代器变成 next() 和 stop() 两个函数,意思是在其他代码位置一个个读取迭代器元素,最好在最上面写 defer stop()。go 容易阅读是很多使用者喜欢的原因,难以想象到处充斥这种迭代器的代码的阅读体验。生成迭代器和使用迭代器的代码位置可能相差十万八千里,调试打断点估计都不好找位置🤣
zhuangzhuang1988
83 天前
PTLin
83 天前
看来不止我一个觉得丑,之前在一个群喷这个语法,一个大佬搬出了一堆文章和 x 上的博客证明这个 push 的迭代器多么先进。
pkoukk
83 天前
这迭代器太丑了,没眼看
assassing
83 天前
函数签名 3 个 func 看傻了,要是 2 个还能接受
ninjashixuan
83 天前
真真的太丑了,之前提案阶段就一堆人吐槽了。
dbpe
83 天前
问题来了...这 shit 的提案..怎么过的?
dyllen
83 天前
@dbpe go 是 Google 主导,他们自己的提案肯定会通过的,外面的人反对无效。
Donahue
83 天前
喜欢 go 语言,交叉编译二进制运行很好。但是语法真的丑。
Jinnrry
83 天前
我以前都会吹 go 大道至简,代码易读。但是看到这玩意,我以后不吹了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1066038

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX