首页 > 后端开发 > Golang > 正文

Go 中的 range-over-func

WBOY
发布: 2024-08-19 04:42:32
原创
509 人浏览过

range-over-func in Go

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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!