面试题答案
一键面试- 输出结果:
- 第一个
fmt.Println(a)
输出10
。 - 第二个
fmt.Println(a)
输出0
。
- 第一个
- 原因分析:
- 在
main
函数中,首先声明了一个全局变量a
并初始化为0
(var a int
,Go语言中未显式初始化的变量会使用其零值,int
的零值是0
)。 - 在内部的花括号
{}
代码块中,a := 10
这行代码实际上声明并初始化了一个新的局部变量a
,它与外部声明的a
不是同一个变量。这里的:=
是短变量声明语法,会在当前作用域中声明一个新变量并初始化。由于这个新变量a
作用域仅限于内部花括号代码块,所以在这个代码块内,第一个fmt.Println(a)
输出10
。 - 当执行到第二个
fmt.Println(a)
时,此时处于外部main
函数的作用域,访问的是外部声明的a
,其值为0
,所以输出0
。
- 在
- 变量初始化与作用域关系:
- 作用域决定可见性:变量的作用域决定了该变量在程序中哪些部分是可见和可访问的。在Go语言中,大括号
{}
定义了一个新的作用域。在内部作用域声明的变量不能在外部作用域访问。 - 初始化与作用域关联:使用
:=
进行短变量声明并初始化时,会在当前作用域创建新变量。如果当前作用域中已经存在同名变量,会引发编译错误,除非新变量声明在内部嵌套作用域。例如上述代码,外部作用域声明a
后,内部作用域a := 10
创建了新的局部变量a
。如果在同一作用域再次使用a := 20
(没有var a int
这种外部作用域声明情况下)会报错,因为a
已经在该作用域声明过了。而在不同作用域,同名变量可以共存且相互独立,互不影响,其值和生命周期都由各自所在作用域决定。
- 作用域决定可见性:变量的作用域决定了该变量在程序中哪些部分是可见和可访问的。在Go语言中,大括号