• 11 Go的作用域


    概述

            在上一节的内容中,我们介绍了Go的映射,包括:声明映射、初始化映射、操作映射等。在本节中,我们将介绍Go的作用域。在Go语言中,作用域是指变量的可见性范围,它定义了变量在程序中的生命周期和可访问性。Go语言中的作用域可以分为以下几种:局部作用域、全局作用域、命名空间作用域,下面分别进行介绍。

    局部作用域

            局部作用域也称为函数作用域,是指在函数内部定义的所有变量和常量都具有局部作用域。这些变量和常量的生命周期仅限于函数内部,在函数外部是不可见的。

            当在函数内部声明一个变量或常量时,它会在局部作用域中创建。在该函数或方法的执行期间,这些变量和常量是有效的,并且可以在函数或方法的代码块中使用。一旦函数或方法执行结束,这些变量和常量就会被销毁,其内存空间将被释放。

    1. package main
    2. import "fmt"
    3. func main() {
    4. // 局部变量作用域
    5. {
    6. var localVar = "Hello CSDN"
    7. // 输出:Hello CSDN
    8. fmt.Println(localVar)
    9. }
    10. // 局部变量作用域已经结束,到这里时localVar不再可见
    11. // 编译错误:undefined: localVar
    12. fmt.Println(localVar)
    13. }

            在上面的示例代码中,localVar是在main函数内部代码块定义的局部变量,它的作用域仅限于该函数内部的代码块。在main函数的代码块中,我们可以使用localVar,并且它对于外部是不可见的。一旦离开main函数的代码块,尝试访问localVar将导致编译错误,因为它已经超出了局部作用域的范围。

    全局作用域

            全局作用域也称为包作用域,是指变量在整个程序中都可以被访问和使用的作用域。全局变量在函数体外声明,可以在整个包的代码文件中使用。在Go语言中,所有在函数外部定义的变量都具有全局作用域,这意味着它们可以在整个程序的执行过程中被访问。

            需要注意的是:如果在某个函数内部定义了与全局变量同名的变量,则函数内部的变量会覆盖全局变量,但不会影响其他函数对全局变量的访问。

    1. package main
    2. import "fmt"
    3. // 全局变量声明
    4. var globalVar = "Global CSDN"
    5. func main() {
    6. // 局部变量声明
    7. var localVar = "Local CSDN"
    8. // 输出:Global CSDN
    9. fmt.Println(globalVar)
    10. // 输出:Local CSDN
    11. fmt.Println(localVar)
    12. // 同名局部变量覆盖全局变量
    13. func() {
    14. var globalVar = "Local CSDN 2"
    15. // 输出:Local CSDN 2
    16. fmt.Println(globalVar)
    17. }()
    18. // 函数内部访问全局变量
    19. func(x int) {
    20. // 输出:Global CSDN
    21. fmt.Println(globalVar)
    22. // 输出:66
    23. fmt.Println(x)
    24. }(66)
    25. }

            在上面的示例代码中,我们声明了一个全局变量globalVar,并在main函数内部声明了一个局部变量localVar。我们可以从main函数内部,以及嵌套的函数内部访问全局变量globalVar。当嵌套函数内部声明了同名的局部变量globalVar时,则会覆盖全局变量globalVar。

            注意:在同一个包内,全局变量可以在任何函数之间共享和访问。但是,在不同的包之间,全局变量是独立的,即每个包都有自己的一套全局变量。

    命名空间作用域

            命名空间作用域是指代码文件中每个包所具有的独立作用域。每个包都有自己的命名空间,其中声明的变量、函数和类型等在该包的代码文件中是可见的,但在其他包中是不可见的。

            命名空间作用域用于隔离不同包之间的代码,以避免命名冲突和意外访问。在同一命名空间下的代码可以自由地访问和共享变量、函数和类型等,但不同命名空间之间的代码是相互独立的。

            在Go语言中,如果我们在一个包中声明了一个变量或函数,其他包无法直接访问该变量或函数,除非我们通过导入该包并使用该变量或函数的导出名进行访问。这种命名空间隔离机制有助于维护代码的清晰性和可维护性。

            在下面的示例代码中,我们编写了两个go源码文件,其中一个为example1.go文件。

    1. // 文件名:example1.go
    2. package example1
    3. var Var1 = "Hello, CSDN"
    4. func Func1() {
    5. fmt.Println(Var1)
    6. }

            另外一个为example2.go文件。

    1. // 文件名:example2.go
    2. package example2
    3. import "fmt"
    4. import "example1"
    5. func main() {
    6. // 输出:Hello, CSDN
    7. fmt.Println(example1.Var1)
    8. // 输出:Hello, CSDN
    9. example1.Func1()
    10. }

            在上面的示例代码中,example1包和example2包分别具有独立的命名空间。在example1包中,我们声明了变量Var1和函数Func1,它们在该包的代码文件中是可见的。在example2包中,我们导入了example1包并尝试访问其中的变量和函数。通过使用导入的包的名称作为前缀,我们可以访问example1包中的变量和函数。

  • 相关阅读:
    [GYCTF2020]Ez_Express
    系统管理员道德规范
    十 动手学深度学习v2 ——卷积神经网络之NiN + GoogLeNet
    暗云III木马技术分析
    vue实现酷炫可视化大屏
    AutoSAR 标准--基础安全特性
    7. 顺序查找、折半查找(折半查找树)、分块查找
    Ubuntu 软件管理学习笔记
    详解clientWidth,scrollWidth,offsetWidth,innerWidth,outerWidth
    安装pandas==0.22.0时的问题
  • 原文地址:https://blog.csdn.net/hope_wisdom/article/details/134365526