首页 > 其他分享 >15分钟学 Go 第 11 天:变量作用域

15分钟学 Go 第 11 天:变量作用域

时间:2024-10-21 10:21:01浏览次数:7  
标签:11 main 15 作用域 fmt 局部变量 Println 全局变量

第11天:变量作用域

目标:学习局部和全局变量

在Go语言中,变量的作用域决定了变量的可见性和生命周期。理解变量的作用域对于有效编写和组织代码至关重要。此次内容将涵盖局部变量和全局变量的定义、使用、作用域规则以及注意事项。

1. 什么是变量作用域

变量作用域是一个变量可以被访问的范围。在Go语言中,变量主要分为局部变量和全局变量:

  • 局部变量:在函数内部声明的变量,仅在函数执行期间可用。
  • 全局变量:在包的顶层声明的变量,可以在包内的任何函数中访问。

2. 局部变量

局部变量只能在它定义的函数或代码块中访问。它的生命周期从变量被声明的那一刻开始,到函数返回时结束。

2.1 声明局部变量

局部变量的声明一般使用var关键字或简短语法:=

例子:
package main

import "fmt"

func main() {
    var x int = 10 // 使用 var 关键字声明局部变量
    y := 20       // 使用简短语法声明局部变量

    fmt.Println("In main function:")
    fmt.Println("x =", x)
    fmt.Println("y =", y)

    testFunction() // 调用另一个函数
}

func testFunction() {
    // fmt.Println(x) // 这里会报错,因为x在这个作用域不可见
    z := 30
    fmt.Println("In testFunction:")
    fmt.Println("z =", z)
}
2.2 代码解析
  1. main函数中,声明了局部变量xy,并打印其值。
  2. 调用testFunction函数,testFunction只能访问自己内部的变量z
2.3 作用域规则
  • 变量的作用域从声明位置开始,至程序执行离开该作用域。
  • 在嵌套函数中,内部函数可以访问外部函数的局部变量。

3. 全局变量

全局变量在包的顶层声明,可以在该包的任何函数中访问。在代码组织上,使用全局变量需谨慎,以避免意外修改和增加代码耦合度。

3.1 声明全局变量

全局变量通常在包的头部声明。

例子:
package main

import "fmt"

var globalVar int = 100 // 全局变量

func main() {
    fmt.Println("In main function:")
    fmt.Println("globalVar =", globalVar)

    modifyGlobalVar() // 调用修改全局变量的函数
    fmt.Println("After modifyGlobalVar:")
    fmt.Println("globalVar =", globalVar)
}

func modifyGlobalVar() {
    globalVar += 50 // 修改全局变量
    fmt.Println("In modifyGlobalVar:")
    fmt.Println("globalVar =", globalVar)
}
3.2 代码解析
  1. 在包头部声明了全局变量globalVar
  2. main函数中调用modifyGlobalVar函数,修改了全局变量的值。

4. 变量作用域的视觉化

为了更好理解局部变量和全局变量的作用域,我们可以用图示展示其关系。下图展示了main函数和testFunction的作用域。

+-----------------------------+
|          Package            |
|                             |
|  +-----------------------+  |
|  |       Global Var     |  |
|  |       globalVar      |  |
|  +-----------------------+  |
|                             |
|  +-----------------------+  |
|  |      func main       |  |
|  |                       |  |
|  |  var x               |  |
|  |  y := 20             |  |
|  |                       |  |
|  |  +------------------+|  |
|  |  |  func           | |  |
|  |  |  testFunction   | |  |
|  |  |                  | |  |
|  |  |  z := 30        | |  |
|  |  +------------------+|  |
|  +-----------------------+  |
+-----------------------------+

5. 作用域注意事项

  • 遮蔽:在内部作用域中声明的变量会遮蔽外部作用域中同名的变量。
package main

import "fmt"

var value int = 100 // 全局变量

func main() {
    var value int = 50 // 局部变量,遮蔽了全局变量
    fmt.Println("Inside main, value =", value) // 输出局部变量
}

func anotherFunction() {
    fmt.Println("Inside anotherFunction, value =", value) // 输出全局变量
}
  • 初始化:局部变量必须显式初始化,全局变量默认为零值。

6. 使用场景

选择使用局部变量还是全局变量应依赖于具体情况:

  • 局部变量更加个性化,适用于临时计算和处理。
  • 全局变量适合共享状态,但应限制其使用以开闭原则(Open/Closed Principle)。

7. 实战示例

假设我们在开发一个简单的在线书店应用,使用局部变量和全局变量来跟踪库存和销售:

package main

import (
    "fmt"
)

var totalSales int = 0 // 全局变量,用于记录总销售额

func sellBook(price int) {
    totalSales += price // 更新全局变量
    fmt.Printf("Book sold for $%d\n", price)
}

func displayTotalSales() {
    fmt.Printf("Total sales: $%d\n", totalSales)
}

func main() {
    sellBook(29)
    sellBook(15)
    displayTotalSales()
}

8. 将内容总结为表格

变量类型作用域生命周期初始化规则
局部变量仅在函数或代码块内可用函数调用时开始,返回时结束必须显式初始化
全局变量包内所有函数可用程序执行期间持续存在默认为零值

9. 常见问题解答

  1. Q: 我可以在局部作用域中修改全局变量吗?

    • A: 是的,可以,但需小心避免影響可读性。
  2. Q: Go语言中有没有隐式变量?

    • A: Go语言不允许隐式变量声明,所有变量必须明确声明。
  3. Q: 局部变量会影响全局变量吗?

    • A: 如果局部变量与全局变量同名,则局部变量会遮蔽全局变量的访问。
  4. Q: 推荐如何管理全局变量?

    • A: 尽量避免使用全局变量,使用结构体或传参来管理状态。

10. 总结与反馈

了解局部和全局变量的作用域对Go语言开发至关重要。通过不同的例子和视觉化效果,帮助学生更好地理解如何在自己的项目中合理使用这些变量。


怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

标签:11,main,15,作用域,fmt,局部变量,Println,全局变量
From: https://blog.csdn.net/weixin_40780178/article/details/143103607

相关文章

  • 在小红书上用AI数字人做心理学赛道,15天涨1.6万粉
    家人们!说实话,用AI数字人带货确实是对于普通人变现最快的项目,但对于AI数字人玩法,许多小伙伴还只是停留在单纯做视频带货的认知层面。但对于高阶玩家,早于将AI数字人si域变现,玩得如火纯青了。si域高客单转化,才是真正的变现无上限,且复购率强。最典型案例就是通过数字人,引流si......
  • Springboot计算机毕业设计仓储线上管理系统7te15
    Springboot计算机毕业设计仓储线上管理系统本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:用户,员工,材料信息,材料入库,材料出库,供应商,商品信息,商品类型,订单信息,利润信息,材料盘点,商品盘点开......
  • YOLOv11环境搭建&推理测试
    引子2024年9月30日,Ultralytics在其活动YOLOVision中正式发布了YOLOv11。YOLOv11是由位于美国和西班牙的Ultralytics团队开发的YOLO的最新版本。几个月前YOLOv10发布(感兴趣的童鞋可以移步https://blog.csdn.net/zzq1989_/article/details/139408779?spm=1001.2014.3001.5502),这才......
  • P11217 【MX-S4-T1】「yyOI R2」youyou 的垃圾桶(线段树上二分)
    link赛时是想到普通的线段树+二分\(O(q\log^2n)\),预期是70pts,实际50pts后面发现又是在longlong类型的计算中,1ll写成了1,然后爆负数,复杂度就错了,T了四个点开题,读起来是一个很套路的题目要对区间在线修改,区间加、(区间乘?),发现数据很大,那就是线段树、树状数组维护了思......
  • PHP蔬菜水果销售系统-毕业设计源码09153
     摘 要本项目旨在基于PHP开发设计一个蔬菜水果销售系统,旨在为农产品销售行业提供一个高效的电子商务平台。该系统将包括商品展示、在线购买、订单管理、支付功能等,以满足消费者的购物需求。通过PHP编程语言,结合数据库管理和网页设计技术,实现系统的设计与开发。该项目......
  • 基数排序1111
    相对于其他排序,基数排序不是将两个数作比较,通过将他们的个,十,百,千等位存入对应的桶中,桶可以为10个,对应着0-9,还有一点如果数字的最大位不同,那需将其他小于最大位的数前面补0,保持与最大位的数的位一致。进入的顺序和出去的顺序是一致的013021011052062043个0123456021,011052,06......
  • P11211 随机数生成器 题解
    前置知识:原根,exCRT。首先\(t=1\)是容易的,直接相邻的除一下即可。否则考虑询问除连续的\(5\)个数,分别为\(a_0,a_1,\cdots,a_4\)。首先特判掉存在\(a_i=0\)的情况,此时直接枚举\(s\)即可。我们先求出\(p\)的一个原根\(g\),设离散对数\(\log(x)=y\)表示\(g^y\equiv......
  • 20222411 2024-2025-1 《网络与系统攻防技术》实验三实验报告
    1.实验内容1.1实践内容(1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧正确使用msf编码器,使用msfvenom生成如jar之类的其他文件veil,加壳工具使用C+shellcode编程(2)通过组合应用各种技术实现恶意代码免杀如果成功实现了免杀的,简单语言描述原理,不要......
  • 111 - Lecture 5
    Decomposition,AbstractionandFunctions1.编程中的基础语言机制(basiclanguagemechanisms):回顾我们已经学习的Java基本语法,包括:•Primitives原始数据类型(byte,short,int,long,float,double,boolean,char)•complexexpressions复杂表达式•branching......
  • [SAP ABAP] SE11定义数据类型(结构与表类型)
    1.定义结构使用事务码SE11创建数据类型(结构),输入自定义的数据类型名称,点击创建按钮勾选结构并点击确定按钮 填写简短描述,并在"组件"页签上添加相关字段信息,点击激活按钮即可生效该结构ZSPO_HEADER_4372.定义表类型在定义表类型之前,我们先使用事务码SE11定义结构勾......