Go to Learn Go之作用域

简介: Go to Learn Go之作用域

概述

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

局部作用域

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

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

package main

import "fmt"

func main() {
    // 局部变量作用域  
    {  
        var localVar = "Hello Hope"
        // 输出:Hello Hope
        fmt.Println(localVar)
    }  
  
    // 局部变量作用域已经结束,到这里时localVar不再可见
    // 编译错误:undefined: localVar
    fmt.Println(localVar)
}

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

全局作用域

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

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

package main

import "fmt"

// 全局变量声明  
var globalVar = "Global Hope"

func main() {
    // 局部变量声明  
    var localVar = "Local Hope"  

    // 输出:Global Hope
    fmt.Println(globalVar)
    // 输出:Local Hope
    fmt.Println(localVar)
  
    // 同名局部变量覆盖全局变量
    func() {
        var globalVar = "Local Hope 2"
        // 输出:Local Hope 2
        fmt.Println(globalVar)  
    }()  
  
    // 函数内部访问全局变量
    func(x int) {
        // 输出:Global Hope
        fmt.Println(globalVar)
        // 输出:66
        fmt.Println(x)
    }(66)  
}

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

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

命名空间作用域

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

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

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

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

// 文件名:example1.go
package example1

var Var1 = "Hello, Hope"

func Func1() {
    fmt.Println(Var1)
}

另外一个为example2.go文件。

// 文件名:example2.go
package example2
  
import "fmt"
import "example1"
  
func main() {
    // 输出:Hello, Hope
    fmt.Println(example1.Var1)
    // 输出:Hello, Hope
    example1.Func1()
}

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

相关文章
|
12天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
8天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2522 18
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
8天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1525 15
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
4天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
10天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
596 14
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19283 30
|
10天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
498 49
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18845 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17530 13
Apache Paimon V0.9最新进展
|
3天前
|
云安全 存储 运维
叮咚!您有一份六大必做安全操作清单,请查收
云安全态势管理(CSPM)开启免费试用
368 4
叮咚!您有一份六大必做安全操作清单,请查收