MST

星途 面试题库

面试题:Go语言中变量初始化与作用域的关联

在Go语言中,有如下代码块: ```go package main import "fmt" func main() { var a int { a := 10 fmt.Println(a) } fmt.Println(a) } ```请分析这段代码的输出结果,并详细解释原因,说明变量初始化与作用域之间的关系。
19.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

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