先决条件: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