go语言学习 函数
不定参数传参:
不定参数必须放在最后否则会产生歧义编译不通过,
不定参数因为传的是不定数量想同类型的参数所以实质上是以数组形式传入的,
可以在函数内用len()函数对参数进行使用,
因为实质上是传入数组所以传参的时候直接传入数组也可以,ps: arg[:2] arg[5:] arg[2:5],
可以实现部分数组的传入,
func AAA(a int,b int,c ...int){
}
AAA(arg[2:5]...)
返回值问题 :
go可以有多个返回值,
go推荐 func AAA(a int)(result int){
result = a+1
return
} 因为返回值有多个所以对返回值命名赋值的方法 稍微好那么一点点点
递归函数: 略
函数类型:type <name> func(参数)(返回值) 类似于C的函数指针
回调函数:可以通过函数指针作为参数实现相同参数返回值但功能不同的动态多态
匿名函数: 在函数内部声明函数,可以调用函数栈声明的变量资源,可用自动推导类型定义一个函数指针指向函数, ps:我的理解匿名函数没有自己的函数栈使用的都是宿主函数的资源,只不过是对一种操作的封装
ps:以目前的理解水平感觉没啥太大意义 适用于需要在函数体内大量进行一种操作并且不能用循环解决来简化代码,同时这个函数功能对工程其他函数没有作用情况下实现匿名函数比较有用
闭包:
func f() *Cursor {
var c Cursor
c.X = 500
noinline()
return &c
}
Cursor是一个struct,这种写法如果在c语言中是不允许出现的,因为变量c是在栈上分配的空间,当函数f结束返回c的地址的时候就失效了(局部变量的使用范围)。但是在go语言规范中有说明,这种写法是合法的。语言会自动识别处这种情况并在堆上分配c的空间,而不是在函数f的栈上。这样就逃逸了局部变量的范围。也就是闭包存在的原因!
当形成闭包时匿名函数指针以及运行环境会从栈区逃逸到堆区,当然这个逃逸是go语言支持才形成的系统检测到匿名函数以返回值的形式传出判定为数值有用将其指针和运行环境保存至了堆区而这个闭包会在系统判定不会再被用的时候销毁---个人猜测是在承接函数运行结束的时候如果没有传出闭包会被垃圾回收引擎销毁