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

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

11711 次点击
所在节点    Go 编程语言
105 条回复
28Sv0ngQfIE7Yloe
306 天前
有点炫技啊, 理解起来有一定的心智负担
zhwq
306 天前
看来又要换坑了,就像早年 PHP 支持 namaspace ,之后就是一日不一日。
语言有没有变的更高级我不知道,我只知道,用的越来越少了
cheng6563
306 天前
幸好泛型没用()
cmdOptionKana
306 天前
@Morii 这是一板一眼最“老实”的笨办法的写法,与炫技毫无关系。
me1onsoda
306 天前
go 的源码不是本来就很难看吗。。。
dyllen
306 天前
@cmdOptionKana 菜鸡还真看不出来,看着就挺复杂的。
LieEar
306 天前
func Backward[E any](s []E) func(func(int, E) bool) {
return func(yield func(int, E) bool) {

眼前一黑
cmdOptionKana
306 天前
@dyllen 什么菜不菜的,不习惯而已。

就像 react 、vue 刚出来的时候,一堆用习惯了 jQuery 的人说 react 复杂,等 react 流行后,又反过来一堆人说 jquery 啰嗦、乱。其实就是看你习惯哪个。
bv
306 天前
@LieEar 能理解 Java/JavaScript 中的 stream.filter(v -> v !=10 ) 应该对这种形式好理解了。(只是这种高阶函数的形式互通,不是说 go iter 和他们的 stream 功能类似)
CHTuring
306 天前
其实看起来还行吧,就是返回个 yield 的迭代器,不过一般也用不上。
Rehtt
306 天前
emmm 感觉也不是很难理解啊
Nazz
306 天前
@Morii 这样好理解吗

package main

type Vector[T any] []T

func (c Vector[T]) Range(f func(i int, v T) bool) {
for i := 0; i < len(c); i++ {
f(i, c[i])
}
}

func main() {
var vec = Vector[int]{1, 3, 5, 7, 9}
for i, v := range vec.Range {
println(i, v)
}
}
Nazz
306 天前
package main

type Vector[T any] []T

func (c Vector[T]) Range(f func(i int, v T) bool) {
for i := 0; i < len(c); i++ {
if !f(i, c[i]) {
return
}
}
}

func main() {
var vec = Vector[int]{1, 3, 5, 7, 9}
for i, v := range vec.Range {
println(i, v)
}
}
Elaina
306 天前
Golang 自从出了泛型之后就越来越依托答辩了,之前嘴硬说为了简洁,把代码搞得又臭又长,现在又开始整活
dyllen
306 天前
@CHTuring
@Rehtt 实在没想出来平时哪里用得上,解决了我的什么问题导致不好理解,套了好几层的感觉。
cmdOptionKana
306 天前
@Elaina 我怀疑你脱离事实硬黑。对泛型有需求的代码,现在用泛型,代码比以前用 interface 模拟泛型的代码更长?
Elaina
306 天前
@cmdOptionKana 你没看到我说的是之前么,我说之前为了简洁搞得代码又臭又长
cmdOptionKana
306 天前
@Elaina

> Golang 自从出了泛型之后就越来越依托答辩了

你说出了泛型之后,越来越差。但泛型比用 interface 模拟好,不知道为什么评价为“越来越”差。
Elaina
306 天前
@cmdOptionKana 这泛型的方括号你就说是不是依托答辩,而且最开始本身宣传的就是不过度设计,极简,现在不少新特性都跟之前的理念相悖
cmdOptionKana
306 天前
@Elaina 目标是尽量简单,现在虽然没有做到极致完美,但总的来说确实已经非常克制了,也没增加多少复杂的东西。

泛型也是社区每年调查,每年很多人提需求才增加的,也就是说,不加泛型一堆人骂,加了泛型也有人骂,神来了也没有更好的处理方法啊。你是希望不加泛型还是你有更好的泛型方案?

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

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

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

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

© 2021 V2EX