开发者学堂课程【Go语言核心编程 - 基础语法、数组、切片、Map:量作用域】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/625/detail/9611
变量作用域
内容介绍:
一、局部变量
二、全局变量
三、代码块定义变量
一、局部变量
函数内部声明/定义的变量叫局部变量,作用域仅限于函数内部。这个变量无论是首字母大写还是小写,只要在函数内部定义的就是局部变量。
1、案例代码:
package main
import (
"fmt"
)
//函数
func test() {
//age和Name的作用域就只在test函数内部
age := 10
Name := "tom~"
}
func main() {
}
2、代码解析:
打开 vs code,新建一个文件夹 varscope,新建一个文件 main.go,写一个主函数,func test 函数定义了两个变量,一个age赋值为10,另一个Name:=“tom”,这个age和Name的作用域仅限于test这个函数,如果出了这个函数 age 和 Name 就用不了了,age 和 Name 的作用域就只在 test 函数内部,如果在 func main 中用,直接会报错。
二、全局变量
函数外部声明定义的变量叫全局变量,作用域在整个包都有效,如果其首字母为大写,则作域在整个程序有效。
1、案例代码:
package main
import (
"fmt"
)
//函数外部声明/定义的变量叫全局变量,
//作用域在整个包都有效,如果其首字母为大写,则作用域在整个程序有效
var age int = 50
var Name string = “jack~"
//函数
func test() {
//age和Name的作用域就只在 test 函数内部
age := 10
Name := "tom~”
fmt.Println("age=", age)/ / 10
fmt.Println(Name=", Name)// tom~
}
func main(){
fmt.Println("age=", age)// 50
fmt.Println( "Name=", Name) //jack
test()
}
2、代码解析:
var age int = 50和var Name string = “jack~"这两个变量与 age、Name 是两个不同的变量,前面的是全局变量,而后面的是局部变量。如果在前面定义的变量,首字母是小写的,那么这个age在整个包都可以使用,如果首字母是大写的,这个Name 不仅可以在本个包可以使用,在别的包也可以使用。再用fmt.Println("age=", age)输出就不报错了。如果在运行 main 的时候,输出的是50,因为作用域不一样。结果输出一个50和 jack~,跟分析的完全一样。如果继续调用了 test 函数,那么输出的结果就是:
age=50
Name=jack~
age=10
Name=tom~
注意:代码中age全局变量在别的包是用不了的,而 Name 全局变量在别的包可以使用,如果age改成大写,在其它包也可以运行。只有首字母大写的全局变量在本包可以使用,在其它包也可以使用。类似于 public。
三、代码块定义变量
如果变量是在一个代码块,比如 for /if中,那么这个变量的的作用域就在该代码块。
1、案例代码:
package main
import (
"fmt"
)
func main() {
fmt.Println( "age=", age) //5o0
fmt.Println( "Name=", Name) //jack~
test()
//如果变量是在一个代码块,比如 for/ if中,那么这个变量的的作用域就在该代码块
for i := e; i <= 10; i++ {
fmt.Println( "i=",i)
}
var i int
//局部变量
for i = 0; i = 10; i++ {
fmt.Println( "i=",i)
}
fmt.Print1n( "i=",i)
}
2、代码解析:
(1)如果变量是在一个代码块,比如 for/ if中,那么这个变量的的作用域就在该代码块,写一个 for 循环定义一个i,for i = 0; i = 10; i++ ,这个代码输出0-10,在前面相当于定义了一个i,在下面用不了,如果想输出当i退出 for 循环时i等于多少是用不了的,错误原因是i没有定义,因为 for 是在这个代码块里面定义的,出了 for 循环就没用了,如果在下面继续定义,不会报重复的错误。这个i作用域只在 for 这个代码块,i 出来 for 循环就无效了。在下面定义一个i,相当于定义一个新的i。
(2)假设 for 代码块里的变量既可以被循环块使用也可以被外面的输出语句使用,需要 var i int 这样的的话,for 循环里的i相当于在外面定义的,这个作用域就相当一个局部变量了,局部变量是在整个函数体有效,再输出这个i就不会报错。这个i就是 for 循环处理完毕过后i等于的值。if语句也是相同的,这一点与别的编程语言有所区别。重点强调作用域的问题。