Go1.23 带来了在 go1.22 中实验的 range-over-func 功能,如果有人读过示例代码,你可能需要看看。冥想了很长时间。不要那样做。 P'Yod 将以非常简单的方式解释给您阅读
从带范围子句的 For 语句规范开始,添加了 3 种类型的表达式:
func(func() bool) func(func(V) bool) func(func(K, V) bool)
我想添加一个变量来解释如下
f func(yield func() bool) f func(yield func(V) bool) f func(yield func(K, V) bool)
规范说,当我们在 rage 中使用函数 f 作为表达式时,每次在完成函数 f 之前调用yield 函数,我们都会在每个循环中得到结果。等于我们插入产量的值,当我解释它时我仍然很困惑。更好地编写代码
func main() { for range loop { fmt.Println("-") } } func loop(yield func() bool) { yield() yield() }
输出:
- -
如果我们这样写代码,我们会得到2个完整的循环,因为根据规范我们在f中调用了两次yield,这里我们将其命名为loop,它不会返回任何东西给我们。因为我们选择使用一个不接受任何参数的yield模式
另一个例子
func main() { for i := range loop { fmt.Println(i) } } func loop(yield func(int) bool) { yield(3) yield(7) }
输出:
3 7
这样我们也会得到2轮,因为我们调用一次yield,现在range将返回2个值,分别是3和7,我们每次调用yield时都会使用它们
另一个例子
func main() { for i := range loop { fmt.Println(i) } } func Loop(yield func(int, string) bool) { yield(3, "three") yield(5, "five") yield(7, "seven") }
输出:
3 three 5 five 7 seven
我们会得到3个循环,根据每次yield中放入的内容,每个循环得到2个值
我们还可以通过插入任何类型的参数来调用yield,例如
func loop(yield func(string, bool) bool) { yield("three", true) yield("five", false) yield("seven", false) }
现在我们了解了它的机制。当我们阅读困难的例子时,我们会理解更多,比如Go Wiki中的例子:Rangefunc Experiment
package slices 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 } } } }
主要的
s := []string{"hello", "world"} for i, x := range slices.Backward(s) { fmt.Println(i, x) }
更容易阅读,对吧?最后,如何应用它取决于您。我们只看yield被调用了多少次。只有当你把它放在范围
中时你才会得到它
出来的值就是投入收益的值。 End
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3