Go 语言变量作用域

先决条件:Go 语言变量

变量的作用域可以定义为可访问特定变量的程序的一部分。可以在类,方法,循环等中定义变量。像C / C ++一样,在Golang中,所有的标识符都是词法(或静态)作用域,即变量的作用域可以在编译时确定。或者你可以说一个变量只能从定义它的代码块中调用。

Golang变量的范围规则可以分为两类,具体取决于声明变量的位置:

  • 局部变量(在块或函数内部声明)

  • 全局变量(在块或函数外部声明)

局部变量

  • 在函数或块中声明的变量称为局部变量。这些不能在函数或块之外访问。

  • 这些变量也可以在函数内的for,while语句等内部声明。

  • 但是,这些变量可以由函数内的嵌套代码块访问。

  • 这些变量也称为块变量。

  • 如果在同一作用域中用相同的名称声明两次这些变量,则会出现编译时错误。

  • 函数执行结束后,这些变量将不存在。

  • 在循环外声明的变量也可以在嵌套循环内访问。这意味着方法和所有循环都可以访问全局变量。局部变量可被循环访问,并在该函数内执行函数。

  • 在循环体内声明的变量对循环体外不可见。

//局部变量
package main
import "fmt"

//主函数
func main() {

    //从这里开始主函数的局部作用域
    //主函数内的局部变量
    var myvariable1, myvariable2 int = 69, 145

    // 显示变量的值
    fmt.Printf("myvariable1 变量的值 : %d\n", myvariable1)

    fmt.Printf("myvariable2 变量的值 : %d\n", myvariable2)

} // 此处主要函数的局部作用域结束

输出:

myvariable1 变量的值 : 69
myvariable2 变量的值 : 145

全局变量

  • 在函数或块之外定义的变量称为全局变量。

  • 这些在程序的整个生命周期中都可用。

  • 这些在所有函数或块之外的程序顶部声明。

  • 这些可以从程序的任何部分进行访问。

//全局变量
package main
import "fmt"

// 全局变量声明
var myvariable1 int = 100

func main() {

    // 主函数内部的局部变量
    var myvariable2 int = 200

    //显示全局变量
    fmt.Printf("全局变量 myvariable1 的值是 : %d\n", myvariable1)

    //显示局部变量
    fmt.Printf("局部变量 myvariable2 的值是 : %d\n", myvariable2)

    //调用函数
    display()

}

func display() {
    // 显示全局变量
    fmt.Printf("全局变量 myvariable1 的值是 : %d\n", myvariable1)

}

输出:

全局变量 myvariable1 的值是 : 100
局部变量 myvariable2 的值是 : 200
全局变量 myvariable1 的值是 : 100

注意:如果函数中存在与全局变量同名的局部变量,将会发生什么情况?

答案很简单,即编译器将优先选择局部变量。通常,当定义了两个具有相同名称的变量时,编译器会产生编译时错误。但是,如果变量在不同的范围内定义,则编译器会允许它。只要定义了与全局变量同名的局部变量,编译器就会优先考虑该局部变量。

示例:在下面的程序中,您可以清楚地看到输出。由于myvariable1的值为200,这在函数main中给出。因此,可以说局部变量比全局变量具有更高的优先级。

//Go程序显示编译器的优先级
//全局变量上的局部变量
package main
import "fmt"

//全局变量声明
var myvariable1 int = 100

func main() {

    //主函数内的局部变量
    //与全局变量相同
    var myvariable1 int = 200
    // 显示
    fmt.Printf("变量 myvariable1 的值是 : %d\n", myvariable1)
}

输出:

变量 myvariable1 的值是 : 200