当前位置: 首页 > news >正文

Go语言--语法基础7--函数定义与调用--自定义函数

函数是基本的代码块,用于执行一个任务。Go 语言最少有 1 个 main() 函数。你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。

函数声明告诉了编译器函数的名称、返回类型和参数。

函数三要素

  1. 名称 ==》功能
  2. 参数 ==》接口
  3. 返回值 ==》结果

函数分类

  1. 内置函数 ==》不需要引用其他模块,直接使用,例如:len()
  2. 标准库函数 ==》需要引用第三方模块或其他模块,带名称使用,例如:fmt.Println()
  3. 自定义函数 ==》程序员自行编写,自己调用

1、函数定义

Go 语言函数定义格式如下:

func function_name ( [parameter list] ) [return_types] {函数体
}

示例

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

函数定义解析

  • func:函数由 func 开始声明
  • function_name:函数名称,函数名和参数列表一起构成了函数签名。注意:首字母大写表示公开函数,首字母小写是私有函数。
  • parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序及参数个数。参数是可选的,也就是说函数也可以不包含参数。
  • return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。
  • 函数体:函数定义的代码集合。

实例

以下实例为 max() 函数的代码,该函数传入两个整型参数 num1 和 num2,并返回这两个参数的最大值:

/* 函数返回两个数的最大值 */
func max (num1, num2 int) int {/* 声明局部变量 */var result intif (num1 > num2) {result = num1} else {result = num2}return result 
}

2、函数调用

当创建函数时,你定义了函数需要做什么,通过调用该函数来执行指定任务。调用函数,向函数传递参数,并返回值,例如:

package main
import "fmt"func main() {/* 定义局部变量 */var a int = 100var b int = 200var ret int/* 调用函数并返回最大值 */ret = max(a, b) // a, b 实参fmt.Printf( "最大值是 : %d\n", ret )
}/* 函数返回两个数的最大值 */
// num1,num2 是形参
func max(num1, num2 int) int {/* 定义局部变量 */var result intif (num1 > num2) {result = num1} else {result = num2}return result 
}

以上实例在 main() 函数中调用 max() 函数,执行结果为:

最大值是 : 200

3、函数参数

函数如果使用参数,该变量可称为函数的形参。形参就像定义在函数体内的局部变量。

调用函数,可以通过两种方式来传递参数:

值传递

传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。

接下来,让我们使用值传递来调用 swap() 函数:

package main
import "fmt"func main() {/* 定义局部变量 */var a int = 100var b int = 200fmt.Printf("交换前 a 的值为 : %d\n", a )fmt.Printf("交换前 b 的值为 : %d\n", b )/* 通过调用函数来交换值 */swap(a, b) // 值传递,a ==》x,b ==》yfmt.Printf("交换后 a 的值 : %d\n", a )fmt.Printf("交换后 b 的值 : %d\n", b )
}/* 定义相互交换值的函数 */
func swap(x, y int) int {var temp inttemp = x /* 保存 x 的值 */x = y    /* 将 y 值赋给 x */y = temp /* 将 temp 值赋给 y*/return temp;
}

程序中使用的是值传递,所以两个值并没有实现交互,我们可以使用引用传递来实现交换效果。

引用传递

引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

引用传递指针参数传递到函数内,以下是交换函数 swap() 使用了引用传递:

以下我们通过使用引用传递来调用 swap() 函数:

package main
import "fmt"func main() {/* 定义局部变量 */var a int = 100var b int = 200fmt.Printf("交换前,a 的值 : %d\n", a )fmt.Printf("交换前,b 的值 : %d\n", b )/* 调用 swap() 函数* &a 指向 a 指针,a 变量的地址* &b 指向 b 指针,b 变量的地址*/swap(&a, &b) // 引用传递,&a ===》x,&b ===》yfmt.Printf("交换后,a 的值 : %d\n", a )fmt.Printf("交换后,b 的值 : %d\n", b )
}func swap(x *int, y *int) {var temp inttemp = *x /* 保存 x 地址上的值 */*x = *y   /* 将 y 值赋给 x */*y = temp /* 将 temp 值赋给 y */
}

4、函数返回多个值

Go 函数可以返回多个值,例如:

package main
import "fmt"func swap(x, y string) (string, string) {return y, x
}func main() {a, b := swap("Mahesh", "Kumar")fmt.Println(a, b)
}

以上实例执行结果为:

Kumar Mahesh

5、defer 语句

Go 语言中的 defer 语句会将其后面跟随的语句进行延迟处理。在 defer 所属的函数即将返回时,将延迟处理的语句按照 defer 定义的顺序逆序执行,即先进后出。

package main
import "fmt"func main() {fmt.Println("开始")defer fmt.Println(1)defer fmt.Println(2)defer fmt.Println(3)fmt.Println("结束")
}

以上代码执行结果如下:

开始
结束
3
2
1

6、init 函数

每一个源文件都可以包含一个 init 函数,该函数会在 main 函数执行前,被 Go 框架调用,也就是说 init() 函数会在 main() 函数之前执行。

http://www.dtcms.com/a/313094.html

相关文章:

  • Go语言实战案例:TCP服务器与客户端通信
  • HoloLens+vuforia打包后遇到的问题
  • 图像、视频、音频多模态大模型中长上下文token压缩方法综述
  • Connection refused: no further information: localhost/127.0.0.1:2375
  • Git的安装和配置
  • JavaWeb开发
  • XSS-DOM 2
  • [硬件电路-150]:数字电路 - 数字电路与模拟电路的异同
  • 洛谷 B3841:[GESP202306 二级] 自幂数判断
  • 当Windows远程桌面出现“身份验证错误。要求的函数不受支持”的问题
  • 方差 协方差矩阵是什么
  • java的隐式类型转换和强制转换类型
  • 科威特塔观测指南:412米高空俯瞰石油城变迁
  • 在AI技术快速迭代的背景下,如何通过RAG技术提升模型的实时性和准确性?从Naive RAG到Modular RAG:AI技术进化的关键路径
  • 生成式人工智能展望报告-欧盟-04-社会影响与挑战
  • 86、信息系统建设原则
  • Java 中的多态性及其实现方式
  • AI + 云原生:正在引爆下一代应用的技术革命
  • 中国计算机学会杭州分部副主席朱霖潮:多模态大模型的研究进展与未来
  • k8s+isulad 国产化技术栈云原生技术栈搭建4-添加worker节点
  • Java函数式编程之【Stream终止操作】【上】【简单约简】
  • ethtool,lspci,iperf工具常用命令总结
  • 前端面试手撕题目全解析
  • CXGrId中按回车控制
  • 微店所有店铺内的商品数据API接口
  • 宝马集团与SAP联合打造生产物流数字化新标杆
  • 达梦数据库备份与还原终极指南:从基础到增量策略实战
  • [leetcode] 位运算
  • 【网络与爬虫 39】Crawlee现代爬虫革命:TypeScript驱动的智能数据采集框架
  • 井盖识别数据集-2,700张图片 道路巡检 智能城市