Go语言精进之路读书笔记第18条——理解Go语言代码块与作用域
18.1 Go代码块与作用域简介
Go规范定义了如下几种隐式代码块。
- 宇宙代(Universe)码块:所有Go源码都在该隐式代码块中,就相当于所有Go代码等最外层都存在一对大括号。
- 包代码块:每个包都有一个包代码块,其中放置着该包都所有Go源码
- 文件夹代码块:每个文件都有一个文件代码块,其中包含着该文件中的所有Go源码。
隐式代码块规则:
- 每个if、for和switch语句均被视为位于其自己的隐式代码块中;
- switch或select语句中的每个子句都被视为一个隐式代码块。
18.2 if条件控制语句的代码块
- 单if型
if SimpleStmt; Expression {
...
}
{ // 隐式代码块开始
SimpleStmt
if Expression { // 显式代码块开始
...
} // 显式代码块结束
} // 隐式代码块结束
- if {} else {} 型
if SimpleStmt; Expression {
...
} else {
...
}
{ // 隐式代码块开始
SimpleStmt
if Expression { // 显式代码块1开始
...
// 显式代码块1结束
} else { // 显式代码块2开始
...
} // 显式代码块2结束
} // 隐式代码块结束
- if {} else if {} else {} 型
if SimpleStm1t; Expression1 {
...
} else if SimpleStmt; Expression2 {
...
} else {
...
}
{ // 隐式代码块1开始
SimpleStmt1
if Expression1 { // 显式代码块1开始
...
// 显式代码块1结束
} else { // 显式代码块2开始
{ // 隐式代码块2开始
SimpleStmt2
if Expression2 { // 显式代码块3开始
...
// 显式代码块3结束
} else { // 显式代码块4开始
...
} // 显式代码块4结束
} // 隐式代码2块结束
} // 显式代码块2结束
} // 隐式代码块1结束
18.3 其他控制语句的代码块规则简介
- for语句的代码块
for InitStmt; Condition; PostStmt {
...
}
{ // 隐式代码块开始
InitStmt;
for Condition; PostStmt {
// for显示代码块
...
}
} // 隐式代码块结束
for IdentifierList := range Expression {
...
}
// 或
for ExpressionList = range Expression {
...
}
{ // 隐式代码块开始
IdentifierList := InitialValueList
for IdentifierList = range Expression {
// for显示代码块
...
}
} // 隐式代码块结束
- switch-case语句的代码块
switch SimpleStmt; Expression {
case ExpressionList1:
...
case ExpressionList2:
...
default:
...
}
{ // 隐式代码块1开始
SimpleStmt
switch Expression { // 显式代码块1开始
case ExpressionList1:
{ // 隐式代码块2开始
...
} // 隐式代码块2结束
case ExpressionList2:
{ // 隐式代码块3开始
...
} // 隐式代码块3结束
default:
{ // 隐式代码块4开始
...
} // 隐式代码块4块结束
} // 显式代码块1结束
} // 隐式代码块1结束
- select-case语句的代码块
select {
case SendStmt:
...
case RecvStmt:
...
default:
...
}
select { // 显式代码块开始
case SendStmt:
{ // 隐式代码块1开始
...
} // 隐式代码块1结束
case RecvStmt:
{ // 隐式代码块2开始
...
} // 隐式代码块2结束
default:
{ // 隐式代码块3开始
...
} // 隐式代码块3块结束
} // 显式代码块结束