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

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

11713 次点击
所在节点    Go 编程语言
105 条回复
june4
306 天前
@xz410236056 其它语言也都有生成器,比如 js 也有生成器协议,但人家同时还有 yield 语法糖可以掩盖底下丑陋的协议,用起来象 return 一样简单可读,没人会直接用原始协议的格式来写生成器,太丑了。
dyllen
306 天前
@voidmnwzp 不是官方示例,我在别人博客复制的。
allenby
306 天前
看着像是在循环的时候返回本身和索引
lveye
305 天前
官方的例子是这个 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)
MrSeven7
237 天前
func GetIterator[E any](s []E) func() E{
i:=0
return func() E{

return s[i]
}
}

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

https://ex.noerr.eu.org/t/1066038

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

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

© 2021 V2EX