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