Go语言基本语法(四)函数与变量的作用域

函数

Go语言中的函数(Function)是执行特定任务的代码块,它们是构建程序的基本单位之一。函数可以接受输入参数,执行一系列操作,并可返回结果。Go语言的函数设计简洁,强调代码的清晰度和模块化。下面是Go函数的一些关键特征和一个示例说明:

Go函数的特征:

  1. 定义格式:函数以func关键字开始,后面跟着函数名、参数列表(如果有的话)、返回值列表(如果有的话),最后是函数体。

  2. 参数与返回值:函数可以有零个、一个或多个参数,以及零个、一个或多个返回值。参数和返回值的类型需明确指定。

  3. 多值返回:Go语言支持函数返回多个值,这是一个强大的特性,可以用来避免错误码或使用额外的输出参数。

  4. 匿名函数与闭包:Go语言支持匿名函数(也称作lambda函数)和闭包,它们可以捕获其定义时的上下文变量,提供灵活的编程能力。

  5. defer、panic与recover:Go提供了异常处理机制,通过defer来注册延迟执行的函数,panic用于抛出异常,recover则用于捕获并恢复从panic产生的异常流程。

示例说明:

下面是一个简单的Go函数示例,该函数接受两个整数作为参数,返回它们的和与差。

package mainimport "fmt"// 这是一个加减法函数,接受两个int类型的参数,返回两个int类型的值(和与差)
func calculateSumAndDifference(a, b int) (sum int, difference int) {sum = a + bdifference = a - breturn // 自动返回sum和difference
}func main() {// 调用calculateSumAndDifference函数sum, diff := calculateSumAndDifference(10, 5)fmt.Printf("Sum: %d, Difference: %d\n", sum, diff) //输出Sum: 15, Difference: 5
}

形参与实参:

形参与实参是函数调用中两个重要的概念,它们描述了函数参数的两个方面:

形参(形式参数, Formal Arguments)

  • 定义:形参是在定义函数时,在函数签名的括号内声明的参数。它们是一组占位符,代表将来调用函数时将要传递的具体值的位置。形参在函数体内部使用,用于接收调用者提供的数据。
  • 特性
    • 形参仅在函数内部有效,其生命周期局限于函数执行期间。
    • 形参在函数未被调用时并不占用实际的存储空间,只有在函数调用发生时,根据实参分配相应的内存。
    • 形参的名称供函数内部使用,调用者不需要知道形参的名字。
// 函数定义
func addNumbers(x int, y int) int {sum := x + yreturn sum
}

在这个例子中:

  • x 和 y 是形参(形式参数)。它们是函数定义的一部分,用来指定函数需要接收什么样的数据输入。这里,x 和 y 都是整型(int)变量,代表将来调用此函数时用户需要提供的两个整数值的位置。

实参(实际参数, Actual Arguments)

  • 定义:实参是在调用函数时,实际传递给函数的具体值或变量。这些值或变量用来给形参赋值,使得函数能够使用这些数据进行操作。
  • 特性
    • 实参可以是常量、变量、表达式或其它函数的返回值。
    • 调用函数时,实参的值(或地址,对于指针或引用类型)被复制给对应的形参。
    • 实参在调用函数之前必须已经初始化,即具有确定的值。
    • 实参的生命周期独立于函数调用,它们可能在函数调用之前就已经存在,并且在函数调用结束后继续存在。
// 函数调用
result := addNumbers(3, 4)
fmt.Println(result) // 输出结果:7

在函数调用中:

  • 3 和 4 是实参(实际参数)。它们是调用函数时传递给函数的具体数值。在这里,我们将 3 赋给了形参 x,将 4 赋给了形参 y。函数内部,这些实参的值被用来执行计算,然后返回结果。

两者的关系

  • 匹配:在函数调用时,实参的数量、类型和顺序必须与形参一一对应,否则会导致编译错误。
  • 数据传递:调用函数时,实参的值(对于值类型)或引用(对于引用类型)被传递给形参。对于基本数据类型,这种传递是值传递,即形参接收到的是实参的一个副本;而对于指针或引用类型,则是引用传递,形参和实参共享同一份数据的地址。
  • 作用域:形参的作用域局限在函数内部,而实参的作用域则取决于它们在程序中的定义位置,可以是全局的,也可以是局部的。

匿名函数

匿名函数是没有名字的函数,它们可以直接在代码中定义并立即使用,通常作为值传递给其他函数或赋值给变量。匿名函数的语法简洁,形式如下:

add := func(a, b int) int {return a + b
}

在这个例子中,add变量被赋予了一个匿名函数,这个函数接受两个整数参数并返回它们的和。

闭包函数

闭包是Go语言中匿名函数的一个特例,它不仅包含了函数体,还携带了对其定义时周围变量(自由变量)的引用。这意味着闭包可以访问并修改在其外部作用域中定义的变量,即便这些变量在原始作用域之外已经不再存在。闭包使得函数能够“记住”它被创建时的环境。

闭包的一个典型应用场景是返回一个函数,这个返回的函数能继续访问并操作外部函数的局部变量:

func counter() func() int {count := 0 // 这是一个自由变量,被闭包捕获return func() int {count++return count}
}increment := counter()
fmt.Println(increment()) // 输出:1
fmt.Println(increment()) // 输出:2

变量作用域

  1. 局部作用域

    • 在函数体内声明的变量被称为局部变量。它们仅在该函数内部可见,并且在函数执行结束后自动释放。
    • 块作用域:即使是函数内部更小的代码块(如if语句、for循环等内部),声明的变量也只能在该块及其嵌套的子块中访问。
    • 函数参数也是局部变量,它们的作用域限制在该函数内部。
package mainimport "fmt"func main() {// 这是一个局部变量var localVar int = 50fmt.Println("局部变量的值:", localVar) //局部变量的值: 50incrementLocalVar(localVar)// 注意:即使在incrementLocalVar内部修改了localVar的值,这里的值也不会改变fmt.Println("原局部变量的值(未改变):", localVar) //原局部变量的值(未改变): 50
}func incrementLocalVar(num int) {num = num + 10fmt.Println("在函数内部修改后的局部变量的值:", num) //在函数内部修改后的局部变量的值: 60
}
  1. 全局作用域

    • 在函数外部定义的变量称为全局变量,它们在整个包内都是可见的。如果在同一个包的不同文件中要访问全局变量,需要使用import语句中的.操作符来导入该变量所在的文件(尽管通常不鼓励过度使用全局变量)。
    • 全局变量在整个程序生命周期内都存在,且初始化发生在程序启动时。
package mainimport "fmt"// 这是一个全局变量
var globalVar int = 100func main() {fmt.Println("全局变量的值:", globalVar) //全局变量的值: 100modifyGlobalVar()fmt.Println("修改后的全局变量的值:", globalVar) //修改后的全局变量的值: 110
}func modifyGlobalVar() {globalVar = globalVar + 10
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/5295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

消除模型“焦虑”,浪潮信息切中AI生态建设的“症结”

大模型的崛起,真正开启人工智能重塑千行百业的序幕。 此绝非虚言。今年初,《政府工作报告》明确提出深化大数据、人工智能等研发应用,开展“人工智能”行动。这标志着以大模型为代表的新一代人工智能技术将加速进入到垂直行业。 但“人工智…

[C++][算法基础]整数划分(统计动态规划)

一个正整数 𝑛 可以表示成若干个正整数之和,形如:𝑛𝑛1𝑛2…𝑛𝑘,其中 𝑛1≥𝑛2≥…≥𝑛𝑘,𝑘≥1。 我们将这…

Java之内部类

一、内部类的概念 从语法上来说,一个 类 定义在另一个 类 中或者这个 类 中一个方法的内部,那么把这个 类 叫做内部类,另一个 类 叫做外部类。 public class A{ class B{ }public void C(){ class C{ } }} //A是外部类 //B、C是内部类 内部类…

Python_GUI工具包 Pyside6的简介与基础操作

Python_GUI工具包 Pyside6的简介与基础操作 本文默认读者具备以下技能: 熟悉python基础知识,vscode或其它编辑工具 具备自主扩展学习能力 一、Pyside6简介 首先需要在这里先说明一下,我之前写的文章大多是ai相关的内容,此时在这里引入Pyt…

【练习1】

1.字符串最后一个单词的长度 #include <iostream> #include<string> using namespace std;int main() {string a;int res,i,flag;flag1;i0;getline(cin,a);res0;while(flag1){if(a[i]! ){resres1;}else{res0;}if(ia.length()-1){flag-1;}i;}cout<<res<<…

RakSmart站群服务器租用注意事项科普

随着互联网的飞速发展&#xff0c;站群运营成为越来越多企业和个人的选择。而RakSmart作为知名的服务器提供商&#xff0c;其站群服务器租用服务备受关注。在租用RakSmart站群服务器时&#xff0c;源库建议有一些关键的注意事项需要特别留意&#xff0c;以确保服务器的稳定运行…

Blender面操作

1.细分Subdivide -选择一个面 -右键&#xff0c;细分 -微调&#xff0c;设置切割次数 2.删除 -选择一个或多个面&#xff0c;按X键 -选择要删除的是面&#xff0c;线还是点 3.挤出面Extrude -选择一个面 -Extrude工具 -拖拽手柄&#xff0c;向外挤出 -微调&#xff…

Python学习指南

Python是一门应用极为广泛的编程语言&#xff0c;目前在Web开发、爬虫、数据分析、人工智能和机器人开发等领域都有着广泛的应用。Python的语法相对简单&#xff0c;许多人选择通过自学或参加培训来掌握Python技术。针对以就业为目的的学习者&#xff0c;选择学习Python技术时&…

【酱浦菌-爬虫项目】爬取百度文库文档

1. 首先&#xff0c;定义了一个变量url&#xff0c;指向百度文库的搜索接口 ‘https://wenku.baidu.com/gsearch/rec/pcviewdocrec’。 2. 然后&#xff0c;设置了请求参数data&#xff0c;包括文档ID&#xff08;docId&#xff09;和查询关键词&#xff08;query&#xff09;。…

docker各目录含义

目录含义builder构建docker镜像的工具或过程buildkit用于构建和打包容器镜像&#xff0c;官方构建引擎&#xff0c;支持多阶段构建、缓存管理、并行化构建和多平台构建等功能containerd负责容器生命周期管理&#xff0c;能起、停、重启&#xff0c;确保容器运行。负责镜管理&am…

Postgresql的安装教程dbever的连接pgAdmin4的连接

最近在学习Postgresql. 首先&#xff0c;我去官网上下载了Community DL Page12.18这个版本&#xff0c;低版本比较稳定而且文档比较多 https://www.cnblogs.com/xy-ouyang/p/12009503.html 接下来&#xff0c;我去上面的链接参考了连接。打开了postgresql的服务器之后&#x…

基于ARM深入分析C程序

0 基于韦东山b站视频教程 视频链接&#xff1a; C语言的本质(基于ARM深入分析C程序)_哔哩哔哩_bilibili 【直播公开课】韦东山老师嵌入式C语言加强&#xff0c;全天8小时直播&#xff0c;吐血整理可以分集观看&#xff01;_哔哩哔哩_bilibili 1 ARM通用寄存器及其用途 R0-R…

日本Mitutoyo三丰仪器维修QM-Data200数据处理器QMData100 光学测量仪深圳捷达工控维修

QM-DATA200 和视觉单元 扩展 2D 光学测量仪器的功能 为测量提供强大的支持 在当今工业世界的不断进步中&#xff0c;光学器件的重要性 随着加工技术的发展&#xff0c;允许非接触式测量工件尺寸的测量机正在不断增加。 同时&#xff0c;由于车间需要更多的合理化和更少的人力&…

《HCIP-openEuler实验指导手册》1.6 Apache静态资源配置(目录访问)

知识点 常用用途&#xff1a; 软件仓库镜像及提供下载服务&#xff1a; 配置步骤 删除网站主目录中的文件&#xff08;本实验机目录为/home/source ip为192.168.12.137 端口为81&#xff09; cd /home/source rm -rf *在主目录中新建6个文件夹如下图 mkdir test{1..6}新建…

Midjourney之绘画背景的选择

hello 小伙伴们&#xff0c;我是你们的老朋友——树下&#xff0c;今天分享Midjourney提示词中绘画背景的选择&#xff0c;话不多说&#xff0c;直接开始~ 对于背景的选择&#xff0c;Midjourney中主要体现在年代和所处的环境对绘画产生不同的影响 科技的发展&#xff0c;我们…

搭建和配置Stable Diffusion环境,超详细的本地部署教程

跃然纸上的创意、瞬息万变的想象&#xff0c;Stable Diffusion以AI的力量赋予您无限创作可能。在这篇详尽的本地部署教程中&#xff0c;我们将携手走进Stable Diffusion的世界&#xff0c;从零开始&#xff0c;一步步搭建和配置这个强大的深度学习环境。无论您是热衷于探索AI艺…

每日OJ题_DFS爆搜深搜回溯剪枝②_力扣526. 优美的排列

目录 力扣526. 优美的排列 解析代码 力扣526. 优美的排列 526. 优美的排列 难度 中等 假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组 perm&#xff08;下标从 1 开始&#xff09;&#xff0c;只要满足下述条件 之一 &#xff0c;该数组就是一个 优美的排列 &#…

个人如何首次申请专利(详细教程)

环境&#xff1a; win10 专业版 问题描述&#xff1a; 自然人如何首次申请专利&#xff08;详细教程&#xff09; 解决方案&#xff1a; 先提前在国家知识产权局检索查询一下&#xff0c;有没和你要申请专利相关的已经公布的专利&#xff0c;有的话就申请成功机会就比较小 …

安卓手机APP开发_媒体开发部分__保持设备处于唤醒状态

安卓手机APP开发_媒体开发部分__保持设备处于唤醒状态 目录 概述 使用唤醒锁的用法 保持屏幕在亮着 电视的环境模式 保持CPU处于运行状态 概述 为了避免多消耗电池电量,安卓设备会很快进入休眠状态.然而,也是需要保持它一直 处于唤醒的状态,来完成某些工作. 你使用的方…

Agent AI智能体的未来杂谈

Agent AI智能体的未来杂谈 随着AI智能体&#xff0c;特别是Agent AI技术的飞速发展和智能化程度不断提升&#xff0c;其在未来社会中的地位和作用愈发凸显&#xff0c;并将在多个维度深刻影响我们的生活和工作。 首先&#xff0c;在角色定位方面&#xff0c;AI智能体将从单一…