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
。我在网上查了一下,没有得到明确的定义。我知道我们可以在
initialization
的 switch
部分声明 switch 范围变量。
问题:
case
内的变量范围是 case 本身的局部变量?{}
。A block 可能是匹配大括号内的声明和语句的空序列。
Block = "{" StatementList "}" . StatementList = { Statement ";" } .
源代码中除了显式块外,还有隐式块:
- universe块包含所有Go源文本。
- 每个 package 都有一个 package block,其中包含该包的所有 Go 源文本。
- 每个文件都有一个 文件块,其中包含该文件中的所有 Go 源文本。
- 每个 "if"、"for" 和 "switch" 语句都被视为位于其自己的隐式块中。
- “switch”或“select”语句中的每个子句都充当隐式块。
阻止嵌套并影响范围。
正如您在规范中所看到的:每个子句(例如
case
)充当隐式块,而无需显式使用 {}
。