📜  Go 中的变量范围

📅  最后修改于: 2021-10-25 02:11:49             🧑  作者: Mango

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