- 因为个人的原因,好长时间没有更新了。这里将自己学习Go及其区块链的一些笔记、积累分享一下,如果涉及到了文章、文字侵权,请联系我删除或调整。
- 声明语句的作用域是指源代码中可以有效使用这个名字的范围
- 作用域是一个源代码的文本区域,是个语法概念,属于编译期
- 生命期是一块内存被占用的时段,是个内存概念,属于运行期
- 作用域从大到小依次是:
- 全局域:内置类型、函数和常量,可在任意位置访问
- 包域:包级声明,可在同一个包的任何源文件中访问
- 文件域:被导入的包,仅在导入该包的源文件中访问
- 函数域:函数中声明,哪个函数声明哪个函数中访问
- 块域:函数内被花括号括起来的语句块,仅块内访问
- 控制流标号都是函数级作用域
- 不同作用域可包含同名标识符,内层作用域隐藏外层作用域
- 内层作用域可访问外层作用域,外层作用域不可访问内层作用域
- 并非所有作用域都显式地与被花括号包围的语句相对应,比如:
- 隐式的for循环作用域就比显式的循环体作用域要大
- for i := 0; i < 10; i++ { 循环体 }
- for i, v := range a { 循环体 }
- if、else if和switch语句也会在条件部分创建隐式作用域
- if a := foo(); a < 0 { if块 }
- 隐式的for循环作用域就比显式的循环体作用域要大
// 词法作用域
// 最外层大括号 \ / 所有块都能访问在当前块中声明的变量
// 之外及每对大 | 块 | 内部块可以访问在外部块中声明的变量
// 括号之内为块 / \ 外部块不能访问在内部块中声明的变量
package main
import "fmt"
var s = "Hello World!"
func main() {
fmt.Printf("Printing 's' variable from outer block: %v\n", s)
b := true
if b {
fmt.Printf("Printing 'b' variable from outer block: %v\n", b)
i := 42
if i == 42 {
fmt.Printf("Printing 'i' variable from outer block: %v\n", i)
}
}
}
// 打印输出:
Printing 's' variable from outer block: Hello World!
Printing 'b' variable from outer block: true
Printing 'i' variable from outer block: 42