Go语言函数

为完成某一功能的程序指令(语句)的集合,称为函数
在 Go 中,函数分为:自定义函数、系统函数。

基本语法

func 函数名 (形参) (返回值类型列表) {
		执行语句
		return 返回值列表
}
  • Golang 中定义函数的关键字是:func。
  • 形参列表:表示函数的输入。
  • 函数中的语句:表示为了实现某一功能代码块。
  • 函数可以有返回值,也可以没有。返回值也可以有多个。
  • 如果返回多个值,在接收时,希望忽略某个返回值,则使用 _ 符号表示站位忽略。
  • 如果返回值只有一个,(返回值类型列表) 可以不写小括号,直接写返回值类型即可。

函数的递归调用
一个函数在函数体内有调用了本身,我们成为递归调用。

func test(n int) {
	if n > 2 {
		n--
		test(n)
	}
	fmt.Println(n)
}

在这里插入图片描述上图中,test(4) 调用结果,终端输出为:n=2 n=2 n=3。test2(4) 调用结果,终端输出为:n=2。

函数调用需要遵守的重要原则:

  • 执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)。
  • 函数的局部变量是独立的,不会相互影响。
  • 递归必须向退出递归的条件逼近,否则就是无限递归。
  • 当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁。

用地鬼的方式,实现斐波那契数:
在这里插入图片描述
init 函数

  • 每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用,也就是说init函数会在main函数前被调用。
  • 如果一个文件同时包含全局变量定义、init函数和main函数,则执行的流程是:全局变量定义->init函数->main函数。
  • init函数最主要的任务就是完成一些初始化工作。

面试题:如果main.go和utils.go都含有变量定义,init函数时,执行的流程是什么样的?
在这里插入图片描述
匿名函数
Go支持匿名函数,如果我们某个函数只是希望使用一次,可以考虑使用匿名函数,匿名函数也可以实现多次调用。

使用方式一:
在定义匿名函数时,直接调用,这种方式匿名函数只能调用一次。在这里插入图片描述使用方式二:
将匿名函数赋给一个变量(函数变量),再通过该变量来调用匿名函数。
在这里插入图片描述全局匿名函数:
如果将匿名函数赋给一个全局变量,那么这个匿名函数,就成为一个全局匿名函数,可以在程序中有效。
在这里插入图片描述
在这里插入图片描述

闭包
闭包就是一个函数和与其相关的引用环境组合的一个整体(实体)。
在这里插入图片描述

  • addUpper() 是一个函数,返回的数据类型是 func (int) int
  • 闭包的说明:在这里插入图片描述返回的是一个匿名函数,但是这个匿名函数引用到函数外的 n,因此这个匿名函数就和 n 形成一个整体,构成闭包。
  • 闭包是类,函数时操作,n 是字段。函数和它使用到n构成闭包。
  • 当我们反复调用 f 函数时,因为 n 是初始化一次,因此每调用一次就进行一次累计。
  • 我们要搞清楚闭包的关键,就是要分析出返回的函数它使用(引用)到哪些变量,因为函数和它引用到的变量共同构成闭包。
    在这里插入图片描述闭包最佳实践,要求如下:
    1、编写一个函数 makeSuffix(suffix string) 可以接收一个文件后缀名(比如:.jpg),并返回一个闭包。
    2、调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如:.jpg),则返回 文件名.jpg,如果已经有 .jpg 后缀,则返回原文件名。
    3、要求使用闭包的方式完成。
    4、strings.HasSuffix,该函数可以判断某个字符串是否有指定的后缀。
    在这里插入图片描述在这里插入图片描述
    函数中的 defer
    在函数中,经常需要创建资源(比如:数据库连接、文件句柄、锁等),为了在函数执行完毕后,及时的释放资源,Go的设计者提供 defer (延时机制)。
    在这里插入图片描述上面案例的执行输出结果是:
  • ok3 res = 30
  • ok2 n2 = 20
  • ok1 n1 = 10
  • res = 30

defer 的细节说明
在这里插入图片描述函数参数传递的方式

  • 值传递:int系列、float系列、bool、string、数组和结构体。
  • 引用传递:指针、slice、map、channel、interface等。
    其实不管是值传递还是引用传递,传给函数的都是变量的副本,不同的是,值传递的是值的拷贝,引用传递的是地址的拷贝,一般来说,地址拷贝效率高,因为数据量小,而值拷贝决定拷贝的数据大小,数据越大,效率越低。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值