作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。

5.8.1 局部变量

在函数体内声明的变量、参数和返回值变量就是局部变量,它们的作用域只在函数体内:

  1. func test(a, b int) {
  2. var c int
  3. a, b, c = 1, 2, 3
  4. fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
  5. }
  6. func main() {
  7. //a, b, c = 1, 2, 3 //err, a, b, c不属于此作用域
  8. {
  9. var i int
  10. i = 10
  11. fmt.Printf("i = %d\n", i)
  12. }
  13. //i = 20 //err, i不属于此作用域
  14. if a := 3; a == 3 {
  15. fmt.Println("a = ", a)
  16. }
  17. //a = 4 //err,a只能if内部使用
  18. }

5.8.2 全局变量

在函数体外声明的变量称之为全局变量,全局变量可以在整个包甚至外部包(被导出后)使用。

  1. var a int //全局变量的声明
  2. func test() {
  3. fmt.Printf("test a = %d\n", a)
  4. }
  5. func main() {
  6. a = 10
  7. fmt.Printf("main a = %d\n", a) //main a = 10
  8. test() //test a = 10
  9. }

5.8.3 不同作用域同名变量

在不同作用域可以声明同名的变量,其访问原则为:在同一个作用域内,就近原则访问最近的变量,如果此作用域没有此变量声明,则访问全局变量,如果全局变量也没有,则报错。

  1. var a int //全局变量的声明
  2. func test01(a float32) {
  3. fmt.Printf("a type = %T\n", a) //a type = float32
  4. }
  5. func main() {
  6. fmt.Printf("a type = %T\n", a) //a type = int, 说明使用全局变量的a
  7. var a uint8 //局部变量声明
  8. {
  9. var a float64 //局部变量声明
  10. fmt.Printf("a type = %T\n", a) //a type = float64
  11. }
  12. fmt.Printf("a type = %T\n", a) //a type = uint8
  13. test01(3.14)
  14. test02()
  15. }
  16. func test02() {
  17. fmt.Printf("a type = %T\n", a) //a type = int
  18. }
作者:admin  创建时间:2018-06-17 20:04
 更新时间:2018-06-17 20:06