Loading

Go语言精进之路读书笔记第18条——理解Go语言代码块与作用域

18.1 Go代码块与作用域简介

Go规范定义了如下几种隐式代码块。

  • 宇宙代(Universe)码块:所有Go源码都在该隐式代码块中,就相当于所有Go代码等最外层都存在一对大括号。
  • 包代码块:每个包都有一个包代码块,其中放置着该包都所有Go源码
  • 文件夹代码块:每个文件都有一个文件代码块,其中包含着该文件中的所有Go源码。

隐式代码块规则:

  • 每个if、for和switch语句均被视为位于其自己的隐式代码块中;
  • switch或select语句中的每个子句都被视为一个隐式代码块。

18.2 if条件控制语句的代码块

  1. 单if型
if SimpleStmt; Expression {
    ...
}

{ // 隐式代码块开始 
    SimpleStmt

    if Expression {  // 显式代码块开始
        ...
    }  // 显式代码块结束
} // 隐式代码块结束
  1. if {} else {} 型
if SimpleStmt; Expression {
    ...
} else {
    ...
}

{ // 隐式代码块开始
    SimpleStmt

    if Expression {  // 显式代码块1开始
        ...
        // 显式代码块1结束
    } else { // 显式代码块2开始
		...
    } // 显式代码块2结束
} // 隐式代码块结束
  1. 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 其他控制语句的代码块规则简介

  1. 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显示代码块
        ...
    }
} // 隐式代码块结束
  1. 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结束
  1. select-case语句的代码块
select {
    case SendStmt:
        ...
    case RecvStmt:
        ...
    default:
        ...
}
select { // 显式代码块开始
    case SendStmt:
    { // 隐式代码块1开始
        ...
    } // 隐式代码块1结束
    case RecvStmt:
    { // 隐式代码块2开始
    ...
    } // 隐式代码块2结束
    default:
    { // 隐式代码块3开始
    ...
    } // 隐式代码块3块结束
} // 显式代码块结束
posted @ 2024-02-07 17:45  brynchen  阅读(14)  评论(0编辑  收藏  举报