函数概述
Go语言的函数定义格式如下:
func 函数名(参数列表)返回值类型 {函数体}
比如:
func Test(a int, b int) int {}//定义了传入两个int参数,返回int型的test名函数
Go语言相对于C/C++语言的特点
(1)无需声明函数原形
(2)支持不定参数(后续会讲到)
(3)支持多返回值(后续会讲到)
(4)支持命名返回参数(函数返回值的一种类型)
(5)支持匿名函数和闭包(后续会讲到)
(6)函数被视为一种类型,一个实体函数可以赋值给变量
(7)不支持 嵌套包(nested)一个包里不能有两个名字一样的函数
(8)不支持 重载
(8)不支持 默认参数
不定参数列表
不定参数的类型:
Go语言支持两种不定参数类型
(1)固定类型的不定参数
语法格式:
参数名 ...类型名
比如:
func f1(args ...int)//传入int型的不定参数
(2)任意类型的不定参数
语法格式:
参数名 ...interface{}
比如:
func f1(args ...interface{})//传入任意类型的不定参数
注:interface{}为空接口类型,任意类型都实现了空接口,可以将任意类型对象赋值给空接口。
不定参数使用注意事项:
(1)不定参数的位置是形参的最后一个参数。
(2) 函数调用时,定参数必须传值,不定参数根据需要可以不传值。
函数的嵌套调用
Go语言中基本函数调用方法与原理与C中基本相同,此处不再赘述。
主要区别在于不定参数函数的调用
情况1:全部参数传递
Test(args...)//本层不定参数args全部参数传递给test函数
情况2:部分参数传递
使用切片的方式
test(args[2:]...)//编号为2(包括)后面的数据全部传递
函数返回值
Go语言支持命名返回函数和多返回值的情况,所以Go函数返回值的使用非常灵活,可按照一下方法进行归类。
1.单个返回值的情况
(1)指定返回值类型
这种与C情况相似,将返回值类型写在参数列表括号之后。
func Test (a int) int {//Test返回值是int类型
return a //手动返回变量
}
(2)指定返回值变量
这是Go中函数返回值的特色格式,在参数列表之后直接定义返回值变量,返回时不需要指定目标变量。
func Test (a int b int)(sum int){
sum=a+b //返回值变量可以直接使用
return //返回时不需要指定目标变量
}
2.多个返回值的情况
多个返回值情况与上述类似,不再举例。
(1)指定多返回值类型
(2)指定多返回值变量
函数类型
type关键字
type用于新类型声明格式,新类型不是原类型的别名,除了拥有相同的数据存储结构外,新类型和原类型没有任何的关系,使用时除了目标类型是未命名类型,其他情况必须使用显式转换。
使用格式:
type 新类型 原类型【可以是函数类型哦】
type Funcname func(a int,b int) int//原函数是函数类型
匿名函数与闭包
(1)匿名函数
概念:因为Go中有函数类型的概念,所以匿名函数对应于普通变量中的“字面量”。
匿名函数的一般形式:
func (参数列表)返回值列表{函数体}(传参列表)
可以直接赋值给自动变量,变量类型直接推导为对应的函数类型。
(2)闭包
闭包的概念:有权访问另一个函数作用域中的变量的函数。(在一个函数内部创建另一个函数:虽然不能在函数内部直接声明另一个函数,但是可以在一个函数中声明一个函数类型的变量) ,函数的返回值是匿名函数,匿名函数能够捕获原函数的变量,原函数称为闭包。
变量的作用域会随着闭包的使用而延长。
延迟调用defer
defer关键字: 将后面跟随的语句进行延迟处理,将会延迟到函数进行最后的return之后再执行。
注意事项:
(1)defer只能出现在函数的内部。
(2)多个defer,先被defer的语句最后被执行,最后被defer的语句最先被执行。
(3)与匿名函数配合使用时,执行时间在最后,但是传参的动作没有defer。