先决条件:Go 编程语言中的变量
变量的作用域可以定义为程序中可以访问特定变量的部分。变量可以在类、方法、循环等中定义。像 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