Golang函数包含匿名作用域

sys*_*cll 5 scope go

谁能给我一个解释,何时以及为什么在函数中使用匿名作用域?(我不确定它的实际名称)。

我得到了一些旧代码来维护,某些功能包含了我从未见过的“作用域”:

(为演示目的而简化)

func DoSomething(someBoolValue bool) string {
    if someBoolValue {
        // do some stuff
        return "yes"
    }
    {
        // weird scope code
    }
    return "no"
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个Go Playground来演示一些实际代码(抛出错误)。

小智 5

它称为变量作用域和阴影:

Go 使用块进行词法作用域:

1-预声明标识符的范围是 Universe 块。
2-表示在顶层(任何函数外部)声明的常量、类型、变量或函数(但不是方法)的标识符的范围是包块。
3-导入包的包名范围是包含导入声明的文件的文件块。
4-表示方法接收者、函数参数或结果变量的标识符的范围是函数体。
5-函数内部声明的常量或变量标识符的范围从 ConstSpec 或 VarSpec(用于短变量声明的 ShortVarDecl)的末尾开始,到最内层包含块的末尾结束。
6-函数内部声明的类型标识符的范围从 TypeSpec 中的标识符开始,到最内层包含块的末尾结束。在块中声明的标识符可以在内部块中重新声明。当内部声明的标识符在范围内时,它表示内部声明所声明的实体。

包条款不是声明;包名称不会出现在任何范围内。其目的是识别属于同一包的文件并指定导入声明的默认包名称。

您的工作示例代码:

package main

import (
    "fmt"
)

func main() {
    i := 10
    {
        i := 1
        fmt.Println(i)  // 1
    }
    fmt.Println(i)  // 10
}
Run Code Online (Sandbox Code Playgroud)

输出:

1
10
Run Code Online (Sandbox Code Playgroud)

并查看:我们在 Go 中哪里可以使用变量作用域和阴影?