Go中的Label

  1. 1. Go中的Label

Go中的Label

  • Labelbreakcontinue 语句中是可选参数,而在 goto 语句中是必传的参数。Label 只在声明它的函数中有效。只要函数中声明了 Label ,那它在该函数的整个作用域都有效。

    1
    2
    3
    4
    5
    6
    7
    func main() {
    fmt.Println(1)
    goto End
    fmt.Println(2)
    End:
    fmt.Println(3)
    }

    必须在goto之后定义Label

  • 作用域不包括嵌套函数的作用域:

    1
    2
    3
    4
    5
    6
     func() {
    fmt.Println(“Nested function”)
    goto End
    }()
    End:
    //会报编译错误:label End not defined 错误。除此之外还会报:label End defined and not used
  • Label 中没有块作用域的概念。所以不能在嵌套的块作用域中声明重复的 Label

    1
    2
    3
    4
    5
    6
       goto X
    X:
    {
    X:
    }
    //语法错误,会报错X已存在
  • Label 的标识符和其他标识符具有不同的命名空间,所以不会与变量标识符等发生冲突。

    1
    2
    3
    4
    5
        x := 1
    goto x
    x:
    fmt.Println(x)
    //不会报错