MST
星途 面试题库

面试题:Go语言中局部变量和全局变量的作用域区别

请阐述在Go语言里,局部变量和全局变量的作用域范围分别是怎样的?并举例说明在函数内部访问全局变量和定义局部变量时,如何避免命名冲突。
35.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

1. 局部变量作用域

在Go语言中,局部变量的作用域仅限于声明它们的代码块。代码块可以是函数体、for循环体、if语句块等。例如:

package main

import "fmt"

func main() {
    // 局部变量i,作用域仅限于main函数内
    i := 10
    if i > 5 {
        // 这里可以访问i
        j := 20
        // j的作用域仅限于这个if语句块内
        fmt.Println(j) 
    }
    // fmt.Println(j) // 这里访问j会报错,j超出作用域
    fmt.Println(i) 
}

2. 全局变量作用域

全局变量的作用域是整个包,即包内的所有源文件都可以访问全局变量。例如:

package main

import "fmt"

// 全局变量g
var g int

func init() {
    g = 100
}

func main() {
    fmt.Println(g) 
}

3. 避免命名冲突

  • 函数内部访问全局变量:如果函数内部定义了与全局变量同名的局部变量,在函数内部默认访问的是局部变量。若要访问全局变量,可以使用包名限定。例如:
package main

import "fmt"

var num int = 10

func main() {
    num := 20
    fmt.Println(num) 
    fmt.Println(main.num) 
}
  • 定义局部变量:在定义局部变量时,应遵循良好的命名规范,使用具有描述性的名称,尽量避免与全局变量重名。同时,在复杂的代码结构中,要仔细规划变量的作用域,确保变量名在其作用域内的唯一性。例如,在不同的函数中定义同名的局部变量是允许的,因为它们的作用域不重叠。
package main

import "fmt"

func func1() {
    data := "func1 data"
    fmt.Println(data) 
}

func func2() {
    data := "func2 data"
    fmt.Println(data) 
}

func main() {
    func1()
    func2()
}