功能内的功能

时间:2016-12-01 13:38:29

标签: go

我遇到了一些使用如下函数的代码:

func main() {

    ...
    X:
        ...

}

我很担心这是做什么的。这是我创建的一个例子,试图让我们四处乱看,看看发生了什么,但我不完全理解K是什么,它是一个闭包吗?一个lambda函数?

package main

import "fmt"

func main() {
    for i:=0; i<10; i++ {
        K: for j:=0; j<10; j++{
            if i*j == 81 {
                fmt.Printf("%v,%v", i, j)
                break;
            } else {
                continue K;
            }
        }
    } 

}

我对Go和函数式编程也很陌生,所以我试图理解这个概念。

2 个答案:

答案 0 :(得分:7)

它是label statement。您可以将其与gotobreakcontinue一起使用。

来自docs

  

定义从未使用过的标签是违法的。与其他标识符相比,标签不是块作用域,也不与非标签的标识符冲突。标签的范围是声明它的函数体,并排除任何嵌套函数的主体。

在需要以某种方式更改流量的情况下,它们非常有用,例如

K: for i:=0; i<10; i++ {
    for j:=0; j<10; j++{
        if (somefunction(j)) {
            continue K; // stops this for, and continue the outer one
        } else if (otherfunction(i, j)) {
            break K; // stops the outer loop
        }
        ....
    }
}

答案 1 :(得分:1)

这些不是函数,而是golang中的标记语句。

标签语句可用作goto break continue等的目标。