谁能给我一个解释,何时以及为什么在函数中使用匿名作用域?(我不确定它的实际名称)。
我得到了一些旧代码来维护,某些功能包含了我从未见过的“作用域”:
(为演示目的而简化)
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)
| 归档时间: |
|
| 查看次数: |
748 次 |
| 最近记录: |