go语言学习 第5章:函数 - 详解

news/2025/10/7 9:35:34/文章来源:https://www.cnblogs.com/lxjshuju/p/19128203

第5章:函数

函数是编程中不可或缺的一部分,它封装了一段可重复使用的代码,用于执行特定的任务。在Go语言中,函数同样扮演着重要的角色。本章将详细介绍Go语言中函数的定义、调用、参数传递、返回值处理以及一些高级特性,如闭包和匿名函数。

一、函数的定义与调用

(一)函数的定义

在Go语言中,函数的定义使用func关键字。基本语法如下:

func 函数名(参数列表) 返回值列表 {
// 函数体
}
  • 函数名:函数的名称,用于调用函数。
  • 参数列表:函数接收的输入参数,可以有多个参数,也可以没有参数。
  • 返回值列表:函数执行完成后返回的值,可以有多个返回值,也可以没有返回值。
  • 函数体:函数的具体实现代码。
1. 无参数无返回值的函数
package main
import "fmt"
func sayHello(
) {
fmt.Println("Hello, Golang!"
)
}
func main(
) {
sayHello(
) // 调用函数
}
2. 带参数的函数
package main
import "fmt"
func add(a, b int
) int {
return a + b
}
func main(
) {
result := add(10
, 20
)
fmt.Println("结果是:"
, result)
}
3. 多返回值的函数

Go语言支持函数返回多个值。例如:

package main
import "fmt"
func swap(a, b int
) (int
, int
) {
return b, a
}
func main(
) {
x, y := swap(10
, 20
)
fmt.Println("交换后的值:"
, x, y)
}

(二)函数的调用

函数的调用非常简单,只需要使用函数名并传递相应的参数即可。例如:

package main
import "fmt"
func main(
) {
sayHello(
) // 调用无参数函数
result := add(10
, 20
) // 调用带参数函数
fmt.Println("结果是:"
, result)
x, y := swap(10
, 20
) // 调用多返回值函数
fmt.Println("交换后的值:"
, x, y)
}

二、参数传递

(一)值传递

在值传递中,函数接收的是参数的副本,对参数的修改不会影响原始变量。例如:

package main
import "fmt"
func modifyValue(a int
) {
a = 100
}
func main(
) {
num := 10
modifyValue(num)
fmt.Println("修改后的值:"
, num) // 输出 10
}

(二)指针传递

在指针传递中,函数接收的是参数的地址,对参数的修改会影响原始变量。例如:

package main
import "fmt"
func modifyValue(a *int
) {
*a = 100
}
func main(
) {
num := 10
modifyValue(&num)
fmt.Println("修改后的值:"
, num) // 输出 100
}

三、函数的高级特性

(一)匿名函数

匿名函数是没有名称的函数,可以在定义时直接调用,也可以赋值给变量后调用。例如:

package main
import "fmt"
func main(
) {
// 定义并直接调用匿名函数
result :=
func(a, b int
) int {
return a + b
}(10
, 20
)
fmt.Println("结果是:"
, result)
// 将匿名函数赋值给变量
add :=
func(a, b int
) int {
return a + b
}
fmt.Println("结果是:"
, add(30
, 40
)
)
}

(二)闭包

闭包是一个函数和其相关的引用环境的组合。闭包可以捕获外部变量,并在函数外部使用这些变量。例如:

package main
import "fmt"
func getCounter(
)
func(
) int {
var count int
return
func(
) int {
count++
return count
}
}
func main(
) {
counter := getCounter(
)
fmt.Println(counter(
)
) // 输出 1
fmt.Println(counter(
)
) // 输出 2
fmt.Println(counter(
)
) // 输出 3
}

(三)函数作为参数

在Go语言中,函数也是一种类型,可以作为参数传递给其他函数。例如:

package main
import "fmt"
func add(a, b int
) int {
return a + b
}
func subtract(a, b int
) int {
return a - b
}
func operate(a, b int
, operation func(int
, int
) int
) int {
return operation(a, b)
}
func main(
) {
result := operate(10
, 5
, add)
fmt.Println("加法结果:"
, result) // 输出 15
result = operate(10
, 5
, subtract)
fmt.Println("减法结果:"
, result) // 输出 5
}

(四)函数作为返回值

函数不仅可以作为参数传递,还可以作为返回值。例如:

package main
import "fmt"
func getOperation(op string
)
func(int
, int
) int {
if op == "add" {
return
func(a, b int
) int {
return a + b
}
}
else
if op == "subtract" {
return
func(a, b int
) int {
return a - b
}
}
return nil
}
func main(
) {
add := getOperation("add"
)
fmt.Println("加法结果:"
, add(10
, 5
)
) // 输出 15
subtract := getOperation("subtract"
)
fmt.Println("减法结果:"
, subtract(10
, 5
)
) // 输出 5
}

四、函数的命名和文档

(一)函数命名

函数的命名应该清晰地反映其功能。通常使用驼峰命名法,首字母小写表示私有函数,首字母大写表示公有函数。例如:

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

(二)函数文档

在Go语言中,可以通过在函数定义前添加注释来为函数编写文档。这些注释会被go doc工具读取并生成文档。例如:

// Add returns the sum of a and b.
func Add(a, b int
) int {
return a + b
}

五、总结

本章详细介绍了Go语言中函数的定义、调用、参数传递、返回值处理以及一些高级特性,如闭包和匿名函数。函数是Go语言中非常重要的一个概念,它不仅可以让代码更加模块化,还可以通过高级特性实现一些复杂的逻辑。通过合理使用函数,可以使代码更加清晰、易读和易维护。

在接下来的章节中,我们将继续深入学习Go语言的其他特性,如错误处理、数组、切片、映射等。希望读者能够通过这些内容更好地掌握Go语言,提升编程技能。

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

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

相关文章

混沌熵池:“创造之源”还是“皇帝的新衣”?

混沌熵池:“创造之源”还是“皇帝的新衣”? ——论WBUC架构中随机性的哲学、工程与救赎 在勾勒未来智能的宏伟蓝图时,最危险的莫过于将未曾深思的概念奉为圭臬。当我们提出WBUC(悟空博弈单元)架构,并将“混沌熵池…

间谍软件通过虚假自然灾害警报传播

网络安全研究人员发现恶意软件通过虚假火山喷发警报传播至安卓设备,攻击者利用意大利公共警报系统分发SpyNote间谍软件,可完全控制受害者设备并窃取敏感信息。间谍软件通过虚假自然灾害警报传播 网络安全研究人员发现…

东莞市住房和城乡建设厅网站北京营销型网站建设多少钱

一、程序是怎么被执行的 1.在程序中,由引导代码去调用程序中得main函数,而这个过程由链接器完成,链接器将引导代码链接到我们的应用程序构成可执行文件。 2.程序运行需要通过操作系统的加载器来实现,加载器是操作系统中的程序&a…

一个电商网站开发周期是多久中山网站定制公司

概述 之前阿里云人脸识别只提供人脸检测,人脸属性及人脸对比三个API接口,关于这方面的介绍及使用细节,可以参考阿里云人脸识别使用流程简介,之前使用的服务地址为:dtplus-cn-shanghai.data.aliyuncs.com。目前新版本加…

大型网站建设入门wordpress迅雷插件

day04-CSS进阶 目标:掌握复合选择器作用和写法;使用background属性添加背景效果 01-复合选择器 定义:由两个或多个基础选择器,通过不同的方式组合而成。 作用:更准确、更高效的选择目标元素(标签&#xf…

12306网站建设费用豫建市2021 42号

目录​​​​​​​ 环境 获取源码(使用5.0.0版本5.3.0-alpha有问题编译不过) 编译环境准备 编译(使用ninja) 编译(不适用使用ninja) 报错解决 linphone-desktop是一款基于SIP的标准开源网络电话系统,它使用了Qt…

福州建网站的公司wordpress页眉导航

简介 传统的日志系统里汇聚了整个设备上所有程序运行的过程流水日志,难以识别其中的关键信息。因此,应用开发者需要一种数据打点机制,用来评估如访问数、日活、用户操作习惯以及影响用户使用的关键因素等关键信息。 HiAppEvent是在系统层面…

完整教程:Go语言使用阿里云模版短信服务

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

计算机网络物理层基础练习 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

KaTeX手册

前言。 这张表应该涵盖了纯\(\KaTeX\)所有的功能。当然,\(\LaTeX\)公式大全亦可作为部分参考。下面是搬运部分。受支持的功能 这是一张由\(\KaTeX\)支持的\(\TeX\)公式清单。他按照逻辑顺序分类。 这有一个相似的按照…

做网站要钱么西安百度推广运营

Vue 3 引入了两种新的响应式 API:ref 和 reactive。这两个 API 都用于创建响应式数据,但它们的使用场景和行为有所不同。 ref 用途:ref 用于创建基本数据类型的响应式引用,如字符串、数字、布尔值等。 使用方式:在模…

网站备案 接入商icp备案是网站上线前

钟表是一种计时的装置,也是计量和指示时间的精密仪器。钟表的样式千变万化,但是用来显示时间的表盘相差无几,大多数钟表表盘的样式由刻度(共60个,围成圆形)、指针(时针、分针和秒针)…

长沙的科技公司深圳网站建设网站排名优化

From:http://www.job168.com/info/read_87955.html 数据库的种类 大型数据库有:Oracle、Sybase、DB2、SQL server 小型数据库有:Access、MySQL、BD2等。 2007年4月29日消息,国外媒体报道,据权威调研机构IDC初步数据显示&#x…

Qt编写上下界面切换效果/前进到下一个界面/后退到上一个页面/零件工艺及管理设计系统

一、前言说明 上下切换界面的效果在网页上还是比较常见的,也就是后退可以切换到上一个打开的界面,前进可以切换到当前页面的下一个打开过的页面,如果没有上一个下一个则不切换,一般这种功能是一些年纪比较大的人常…

【题解】P1131 [ZJOI2007] 时态同步

P1131 [ZJOI2007] 时态同步 题目传送门题目大意: 给你一棵带边权的树,求出使所有叶节点到根节点的路程相同的最少操作数(每次操作边权加 1 )STEP 1. 看到这个题目后,我们就可以联想到一棵树了,具体来讲: \(n\) …

阿里云怎么做静态网站求一个免费的企业邮箱

验证电脑是否安装python 1.winr输入cmd 2.在黑窗口输入 python.exe 3.不是命令不存在就说明python环境安装完成 抓取快手视频 1.在phcharm应用中新建一个项目 3.新建一个python文件 4.选择python文件,随便起一个名字后按回车 5.安装requests pip install requests 6.寻找需要的…

电商网站设计是干什么的怎么开网店做代理

程序跑出下面的异常:com.ibm.websphere.ce.cm.DuplicateKeyException: ORA-00001: 违反唯一约束条件 (EOMS3.SYS_C0024492),参考下面的文章了解到我的程序可能是序列的问题。(果然是序列产生的最小值设置的太小,将序列值设置大之后…

LGP9120 [NOIP 2022.5] 密码锁 学习笔记

LGP9120 [NOIP 2022.5] 密码锁 学习笔记 洛谷链接 前言 这道 \(\text{LOCK}\) 是二三年春测的最后一道题。作为一道 \(\texttt{CNDS}\),因为随机化算法的存在而显得有点黯然失色。然而,将这道题对扫描线的(相对)复…

深入解析:OpenCV CUDA模块图像处理------创建CUDA加速的Canny边缘检测器对象createCannyEdgeDetector()

深入解析:OpenCV CUDA模块图像处理------创建CUDA加速的Canny边缘检测器对象createCannyEdgeDetector()pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

中小企业网站制作407网站后台管理系统进不去怎么办

MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习。 为了形象地对比两者,再建一个表: CREATE TABLE myInde…