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。
Data Type | Initial Default Value |
---|---|
int | 0 |
float32 | 0 |
pointer | nil |