Go语言 作用域规则

  • 作用域规则

    任何编程中的作用域是程序中可以存在定义的变量并且不能访问该变量的区域。在三个地方可以使用Go编程语言声明变量-
    • 在函数或块内(局部变量)
    • 所有函数之外(全局变量)
    • 在定义函数参数(形式参数)时
    让我们来看看什么是局部和全局变量,哪些是形式参数。
  • 局部变量

    在函数或块内声明的变量称为局部变量。它们只能由该函数或代码块中的语句使用。局部变量在其自身之外的函数中是未知的。以下示例使用局部变量。在这里,所有变量a,b和c都是main()函数的局部变量。
    
    package main
    
    import "fmt"
    
    func main() {
       /* local variable declaration */
       var a, b, c int 
    
       /* actual initialization */
       a = 10
       b = 20
       c = a + b
    
       fmt.Printf ("value of a = %d, b = %d and c = %d\n", a, b, c)
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    value of a = 10, b = 20 and c = 30
    
  • 全局变量

    全局变量是在函数外部定义的,通常在程序顶部。全局变量在程序的整个生命周期中都保持其值,并且可以在为该程序定义的任何函数中访问它们。全局变量可以由任何函数访问。也就是说,在声明之后,全局变量可在整个程序中使用。以下示例同时使用全局变量和局部变量-
    
    package main
    
    import "fmt"
     
    /* global variable declaration */
    var g int
     
    func main() {
       /* local variable declaration */
       var a, b int
    
       /* actual initialization */
       a = 10
       b = 20
       g = a + b
    
       fmt.Printf("value of a = %d, b = %d and g = %d\n", a, b, g)
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    value of a = 10, b = 20 and g = 30
    
    程序的局部变量和全局变量可以具有相同的名称,但是函数内局部变量的值优先。例如-
    
    package main
    
    import "fmt"
     
    /* global variable declaration */
    var g int = 20
     
    func main() {
       /* local variable declaration */
       var g int = 10
     
       fmt.Printf ("value of g = %d\n",  g)
    }
    
    编译并执行上述代码后,将产生以下结果-
    
    value of g = 10
    
  • 形式参数

    形式参数在该函数中被视为局部变量,并且它们优先于全局变量。例如-
    
    package main
    
    import "fmt"
     
    /* global variable declaration */
    var a int = 20;
     
    func main() {
       /* local variable declaration in main function */
       var a int = 10
       var b int = 20
       var c int = 0
    
       fmt.Printf("value of a in main() = %d\n",  a);
       c = sum( a, b);
       fmt.Printf("value of c in main() = %d\n",  c);
    }
    /* function to add two integers */
    func sum(a, b int) int {
       fmt.Printf("value of a in sum() = %d\n",  a);
       fmt.Printf("value of b in sum() = %d\n",  b);
    
       return a + b;
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    value of a in main() = 10
    value of a in sum() = 10
    value of b in sum() = 20
    value of c in main() = 30
    
  • 初始化局部变量和全局变量

    局部变量和全局变量被初始化为其默认值0。而指针初始化为nil。