说明
函数内部声明/定义的变量叫局部变量,作用域仅限于函数内部(不论首字母大写还是小写)
函数外部声明/定义的变量叫全局变量,作用域在整个包都有效(一个包下可以有多个.go文件),如果其首字母为大写,则作用域在整个程序有效。
如果变量是在一个代码块中(如:for / if),那么这个变量的作用域就在该代码块。
package mainimport "fmt"// 全局变量var age int = 18var Name string = "xiao~"// 局部变量func test() {// age和Name的作用域只在test()函数内部有效age := 20Name := "tom"fmt.Println("test()age=", age)fmt.Println("test()Name=", Name)}func main() {test()fmt.Println("age=", age)fmt.Println("Name=", Name)for i := 0; i < 10; i++ {}for i := 0; i < 10; i++ {}}
练习
package mainimport "fmt"// 练习var name string = "jerry"func test01() {fmt.Println("test01()name=", name)}func test02() {name := "jack" // 声明一个新的变量// name = "jack" // 变量赋值 -> 修改全局变量name的值fmt.Println("test01()name=", name)}func main() {// 练习测试fmt.Println("main()name=", name) // main()name= jerrytest01() // test01()name= jerrytest02() // test02()name= jacktest01() // test02()name= jerry}
修改代码
package mainimport "fmt"// 练习var name string = "jerry"func test01() {fmt.Println("test01()name=", name)}func test02() {// name := "jack" // 声明一个新的变量name = "jack" // 变量赋值 -> 修改全局变量name的值fmt.Println("test01()name=", name)}func main() {// 练习测试fmt.Println("main()name=", name) // main()name= jerrytest01() // test01()name= jerrytest02() // test02()name= jacktest01() // test02()name= jack}
错误演示
var Age int = 20 // ok 定义的时候同时赋值Name := "tom" // 报错 syntax error: non-declaration statement outside function body// 相当于var Name stringName = "tom" // 单独的赋值语句不能放到函数外执行
