Golang 变量的范围
变量的范围可以定义为程序中某一特定变量可被访问的部分。一个变量可以被定义在类、方法、循环等。像C/C++一样,在Golang中,所有的标识符都是词法(或静态)范围的,也就是说,一个变量的范围可以在编译时确定。或者你可以说一个变量只能在定义它的代码块中被调用。
Golang的变量范围规则可以分为两类,取决于变量的声明位置。
- 本地变量 (在代码块或函数内声明)
- 全局变量 (在代码块或函数之外声明)。
本地变量
- 在一个函数或程序块内声明的变量被称为本地变量。这些变量在函数或代码块之外不能访问。
- 这些变量也可以在函数内部的for、while等语句中声明。
- 然而,这些变量可以被函数内部的嵌套代码块所访问。
- 这些变量也被称为块变量。
- 如果这些变量在同一范围内以相同的名称声明了两次,就会出现编译时错误。
- 这些变量在函数的执行结束后就不存在了。
- 在循环外声明的变量在嵌套的循环中也可以被访问。这意味着全局变量将被方法和所有循环所访问。局部变量将被循环和该函数内部的函数所访问。
- 在循环体内部声明的变量对于循环体外部是不可见的。
例子
// Go program to illustrate the
// local variables
package main
import "fmt"
// main function
func main() { // from here local level scope of main function starts
// local variables inside the main function
var myvariable1, myvariable2 int = 89, 45
// Display the values of the variables
fmt.Printf("The value of myvariable1 is : %d\n",
myvariable1)
fmt.Printf("The value of myvariable2 is : %d\n",
myvariable2)
} // here local level scope of main function ends
输出
The value of myvariable1 is : 89
The value of myvariable2 is : 45
全局变量
- 在函数或块之外定义的变量被称为全局变量。
- 这些变量在程序的整个生命周期内都是可用的。
- 这些变量被声明在程序的顶部,在所有的函数或块之外。
- 可以从程序的任何部分访问这些变量。
例子
// Go program to illustrate the
// global variables
package main
import "fmt"
// global variable declaration
var myvariable1 int = 100
func main() { // from here local level scope starts
// local variables inside the main function
var myvariable2 int = 200
// Display the value of global variable
fmt.Printf("The value of Global myvariable1 is : %d\n",
myvariable1)
// Display the value of local variable
fmt.Printf("The value of Local myvariable2 is : %d\n",
myvariable2)
// calling the function
display()
} // here local level scope ends
// taking a function
func display() { // local level starts
// Display the value of global variable
fmt.Printf("The value of Global myvariable1 is : %d\n",
myvariable1)
} // local scope ends here
输出
The value of Global myvariable1 is : 100
The value of Local myvariable2 is : 200
The value of Global myvariable1 is : 100
注意: 如果在一个函数中存在一个与全局变量同名的局部变量,会发生什么?
答案很简单,即编译器会优先考虑本地变量。通常情况下,当两个同名的变量被定义时,编译器会产生一个编译时错误。但是如果这些变量被定义在不同的范围内,那么编译器就会允许它。只要有一个局部变量与全局变量的名称相同,编译器就会优先考虑局部变量。
- 例子:在下面的程序中,你可以清楚地看到输出。因为myvariable1的值是200,这是在函数main中给出的。所以你可以说局部变量比全局变量有更高的优先权。
// Go program to show compiler giving preference
// to a local variable over a global variable
package main
import "fmt"
// global variable declaration
var myvariable1 int = 100
func main() { // from here local level scope starts
// local variables inside the main function
// it is same as global variable
var myvariable1 int = 200
// Display the value
fmt.Printf("The value of myvariable1 is : %d\n",
myvariable1)
} // here local level scope ends
输出:
The value of myvariable1 is : 200