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
这个函数这形式看起来还真有点复杂,不好理解。。。。可能例子不是相应场景下需要的,看半天没理解。
感觉一般都用不上。
101
june4 89 天前
@xz410236056 其它语言也都有生成器,比如 js 也有生成器协议,但人家同时还有 yield 语法糖可以掩盖底下丑陋的协议,用起来象 return 一样简单可读,没人会直接用原始协议的格式来写生成器,太丑了。
|
103
allenby 88 天前 via Android
看着像是在循环的时候返回本身和索引
|
104
lveye 88 天前
官方的例子是这个 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) |
105
MrSeven7 20 天前
func GetIterator[E any](s []E) func() E{
i:=0 return func() E{ return s[i] } } |