switch case 内的变量范围

问题描述 投票:0回答:1
package main

import "fmt"

func main() {
    x := 10
    switch x {
    case 0:
        y := 'a'
        fmt.Printf("%c\n", y)
    case 1:
        // y = 'b' // this can't compile,
        y := 'b'
        fmt.Printf("%c\n", y)
    default:
        y := '-'
        fmt.Printf("%c\n", y)
    }
}

似乎每个

y
中的
case
对于包含的
case
来说是局部的,对其他情况不可见。 据我所知:

  • {}
    可以创建局部范围,但每个
    {}
    没有
    case
  • Java 不同。

我在网上查了一下,没有得到明确的定义。我知道我们可以在

initialization
switch
部分声明 switch 范围变量。

问题

  1. 你能否确认,在 Golang 中,switch
    case
    内的变量范围是 case 本身的局部变量?
  2. 这是一个特殊的设计吗?如上所述,每种情况都没有
    {}
go scope
1个回答
4
投票

规格:块:

A block 可能是匹配大括号内的声明和语句的空序列。

Block = "{" StatementList "}" .
StatementList = { Statement ";" } .

源代码中除了显式块外,还有隐式块:

  1. universe块包含所有Go源文本。
  2. 每个 package 都有一个 package block,其中包含该包的所有 Go 源文本。
  3. 每个文件都有一个 文件块,其中包含该文件中的所有 Go 源文本。
  4. 每个 "if""for""switch" 语句都被视为位于其自己的隐式块中。
  5. “switch”“select”语句中的每个子句都充当隐式块。

阻止嵌套并影响范围。

正如您在规范中所看到的:每个子句(例如

case
)充当隐式块,而无需显式使用
{}

© www.soinside.com 2019 - 2024. All rights reserved.