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,它不会返回任何东西给我们。因为我们选择使用产量不接受任何参数的模式
另一个例子
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被调用了多少次。只有当你把它放在范围内时你才会得到它
出来的值就是投入到收益中的值,就是这样。
以上是Go 中的 range-over-func的详细内容。更多信息请关注PHP中文网其他相关文章!