Go语言趣学指南lesson4

变量作用域

本章学习目标

1、知悉变量作用域的好处

2、学会更简洁的方法声明变量

3、了解for、if和switch是如何和变量作用域交互的

4、学会如何控制作用域的范围

什么是作用域

  • 在程序运行过程中,很多变量都会在很短暂的使用后被丢弃,这就是作用域的作用。

  • 当变量被声明后,它就进入了作用域(变量就变得可见了)

    • 只要在作用域里,就可以访问
    • 否则,访问它就会报错
  • 变量声明的位置,决定了它的作用域

  • 作用域的好处?

    • 可以在不通的作用域内使用相同的变量名
  • 在Go里面,作用域的范围是{}之间的部分

  • 例子(4.1)

    package main
    
    import (
    	"fmt"
    	"math/rand"
    )
    
    func main() {
    	var count = 0 //count变量在function作用域里
    
    	for count < 10 {
    		var num = rand.Intn(10) + 1 //num变量在for作用域里
    		fmt.Println(num)
    		count++
    	}
    }
    
    
    执行结果:
    
    2
    8
    8
    10
    2
    9
    6
    1
    7
    1
    

短声明

简单声明为var关键字提供了另一种备选语法,

var count = 10 和count := 10 等价,简短声明还能用在一些无法使用var关键字的地方

例子(4.2)

package main

import (
	"fmt"
)

func main() {
	var count = 0
	for count := 10; count > 0; count-- {
		fmt.Println(count) //随着循环结束这个count变量会释放掉
	}
	fmt.Println(count) //count变量仍在function作用域中
}


执行结果:

10
9
8
7
6
5
4
3
2
1
0

作用域的范围

例子(4.3)

package main

import (
	"fmt"
	"math/rand"
)

var era = "AD" //era变量在整个包都是可用的

func main() {
	year := 2018 //era、year变量都处于作用域之内
	switch month := rand.Intn(12) + 1; month { //era、year、month变量都处于作用域之内
	case 2:
		day := rand.Intn(28) + 1 //era、year、month、day变量都处于作用域之内
		fmt.Println(era, year, month, day)
	case 4, 6, 9, 11:
		day := rand.Intn(30) + 1 //era、year、month变量都处于作用域之内,这个day变量和第一个day变量不在同一个作用域
		fmt.Println(era, year, month, day)
	default:
		day := rand.Intn(31) + 1 //era、year、month变量都处于作用域之内,这个day变量和第一个day变量不在同一个作用域
		fmt.Println(era, year, month, day)
	} //month 和day变量不在处于作用域中
} // year变量不在处于作用域中
  • era变量位于包作用域中,它对整个包都是可见的
  • 包作用域在声明时不能用简短声明
原文地址:https://www.cnblogs.com/walker1024/p/14153154.html