说明

函数内部声明/定义的变量叫局部变量,作用域仅限于函数内部(不论首字母大写还是小写
函数外部声明/定义的变量叫全局变量,作用域在整个包都有效(一个包下可以有多个.go文件),如果其首字母为大写,则作用域在整个程序有效。
如果变量是在一个代码块中(如:for / if),那么这个变量的作用域就在该代码块。

  1. package main
  2. import "fmt"
  3. // 全局变量
  4. var age int = 18
  5. var Name string = "xiao~"
  6. // 局部变量
  7. func test() {
  8. // age和Name的作用域只在test()函数内部有效
  9. age := 20
  10. Name := "tom"
  11. fmt.Println("test()age=", age)
  12. fmt.Println("test()Name=", Name)
  13. }
  14. func main() {
  15. test()
  16. fmt.Println("age=", age)
  17. fmt.Println("Name=", Name)
  18. for i := 0; i < 10; i++ {
  19. }
  20. for i := 0; i < 10; i++ {
  21. }
  22. }

练习

  1. package main
  2. import "fmt"
  3. // 练习
  4. var name string = "jerry"
  5. func test01() {
  6. fmt.Println("test01()name=", name)
  7. }
  8. func test02() {
  9. name := "jack" // 声明一个新的变量
  10. // name = "jack" // 变量赋值 -> 修改全局变量name的值
  11. fmt.Println("test01()name=", name)
  12. }
  13. func main() {
  14. // 练习测试
  15. fmt.Println("main()name=", name) // main()name= jerry
  16. test01() // test01()name= jerry
  17. test02() // test02()name= jack
  18. test01() // test02()name= jerry
  19. }

修改代码

  1. package main
  2. import "fmt"
  3. // 练习
  4. var name string = "jerry"
  5. func test01() {
  6. fmt.Println("test01()name=", name)
  7. }
  8. func test02() {
  9. // name := "jack" // 声明一个新的变量
  10. name = "jack" // 变量赋值 -> 修改全局变量name的值
  11. fmt.Println("test01()name=", name)
  12. }
  13. func main() {
  14. // 练习测试
  15. fmt.Println("main()name=", name) // main()name= jerry
  16. test01() // test01()name= jerry
  17. test02() // test02()name= jack
  18. test01() // test02()name= jack
  19. }

错误演示

  1. var Age int = 20 // ok 定义的时候同时赋值
  2. Name := "tom" // 报错 syntax error: non-declaration statement outside function body
  3. // 相当于
  4. var Name string
  5. Name = "tom" // 单独的赋值语句不能放到函数外执行