Golang 变量的范围

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程