所谓变量作用域,即变量可以作用的范围。
作用域(scope)通常来说,程序中标识符并不是在任何位置都是有效可用的,而限定这个标识的可用性的范围就是这个名字的作用域。
变量根据所在位置的不同可以划分为全局变量和局部变量。

1、局部变量

写在 {} 中或者函数中或者函数的形参,都是局部变量。

  1. 1. 局部变量的作用域是从定义的那一行开始,直到 } 结束或者遇到 return 为止。
  2. 2. 局部变量,只有执行了才会分配存储空间,只要离开作用域就会自动释放。
  3. 3. 局部变量存储在栈区。
  4. 4. 局部变量如果没有使用,编译会报错。全局变量如果没有使用,编译不会报错。
  5. 5. := 只能用于局部变量,不能用于全局变量。

2、全局变量

函数外面的就是全局变量

  1. 1. 全局变量的作用域是从定义的那一行开始,直到文件末尾为止。
  2. 2. 全局变量,只要程序一启动就会分配存储空间,只有程序关闭才会释放存储空间。
  3. 3. 全局变量存储在静态区(数据区)
  1. package main
  2. import "fmt"
  3. func foo() {
  4. x := 10
  5. fmt.Println(x)
  6. }
  7. var x = 30
  8. func main() {
  9. // var x = 20
  10. foo()
  11. fmt.Println(x)
  12. }

注意:for,if语句具备独立开辟作用域的能力。

  1. // if的局部空间
  2. if true{
  3. x:=10
  4. fmt.Println(x)
  5. }
  6. fmt.Println(x) //报错
  7. // for的局部空间
  8. for i:=0;i<10 ;i++ {
  9. }
  10. fmt.Println(i) // 报错