Go语言变量的作用域

一个变量(常量、类型或函数)在程序中都有一定的作用范围,称之为作用域。Go语言中的变量分为三种类型,分别是局部变量、全局变量和形式参数。

如果变量在函数体外声明,则被称为全局变量,可以在整个包甚至外部包(被导出后)使用。如果变量声明在函数体内部,则被称为局部变量,它的作用域只在函数内部。至于形式参数则是在函数定义中函数名右边小括号(参数列表)中的变量,形式参数也是局部变量的一种,只能在函数体内部使用。

局部变量

在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量。
package main

import (
    "fmt"
)

func main() {
    //声明局部变量 a 和 b 并赋值
    var a int = 3
    var b int = 4
    //声明局部变量 c 并计算 a 和 b 的和
    c := a + b
    fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}
运行结果如下所示:

a = 3, b = 4, c = 7

全局变量

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

import "fmt"

//声明全局变量
var c int

func main() {
    //声明局部变量
    var a, b int

    //初始化参数
    a = 3
    b = 4
    c = a + b

    fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}
运行结果如下所示:

a = 3, b = 4, c = 7

Go语言程序中全局变量与局部变量名称可以相同,但是函数体内的局部变量会被优先考虑。
package main

import "fmt"

//声明全局变量
var a float32 = 3.14

func main() {
    //声明局部变量
    var a int = 3

    fmt.Printf("a = %d\n", a)
}
运行结果如下所示:

a = 3

形式参数

形式参数会作为函数的局部变量来使用。
package main

import (
    "fmt"
)

//全局变量 a
var a int = 13

func main() {
    //局部变量 a 和 b
    var a int = 3
    var b int = 4

    fmt.Printf("main() 函数中 a = %d\n", a)
    fmt.Printf("main() 函数中 b = %d\n", b)
    c := sum(a, b)
    fmt.Printf("main() 函数中 c = %d\n", c)
}

func sum(a, b int) int {
    fmt.Printf("sum() 函数中 a = %d\n", a)
    fmt.Printf("sum() 函数中 b = %d\n", b)
    num := a + b
    return num
}
运行结果如下所示:

main() 函数中 a = 3
main() 函数中 b = 4
sum() 函数中 a = 3
sum() 函数中 b = 4
main() 函数中 c = 7