函数类型
函数也是一种数据类型,我们可以通过type来定义它,它的类型就是所拥有相同的参数,相同返回值的一种类型
type FuncType func(int,int) int//声明一个函数类型,func后面没有函数名
func Calc(a,b int,f FuncType)(result int){
result=f(a,b)
return}
func Add(a,b int) int{
return a+b}
var fTest FuncType//声明一个函数类型的变量
fTest=ADD//是变量就可以赋值
result=fTest(10,20)//等价于Add(10,20)
函数调用:第三个参数为函数名字,此函数的参数,返回值必须和FuncType类型一致
result:=Calc(1,1,Add)
回调函数
函数有一个参数是函数类型,这个函数就是回调函数
多态 多种形态 调用同一个接口,可以实现不同表现
先有想法后面再实现功能
匿名函数与闭包
匿名函数没有函数名字
f1:=func(){//:=自动推导类型
}
f1()//调用
func(){
}()//后面的()代表调用此匿名函数
//带参数的匿名函数
func(i,j){
}(10,20)
//匿名函数有参有返回值
x,y:=func(i,j int)(max,min int){
if i>j{ max=i
min=j
}else{
max=j
min=i}
return
}(10,20)
闭包捕获外部函数
闭包以引用方式捕获外部变量
所谓闭包就是一个函数捕获了和它在同一作用域的其他变量和常量。这就意味着当闭包被调用的时候,不管程序在什么时候调用,闭包能够使用这些常量或者变量。它不关心这些捕获的变量和常量是否已经超出作用域,所以只有闭包还在使用它,这些变量就还会存在
在Go语言里,所有的匿名函数(Go语言规范中称之为函数字面量)都是闭包。匿名函数是指不需要定义函数名的一种函数实现方式
//函数的返回值是一个匿名函数,返回一个函数类型
func test02() func() int{ var x int//没有初始化,值为零
return func() int{
x++
return x*x}}
func main(){
f:=test02()
fmt.Println(f())//1
fmt.Println(f())//4}
defer
用于延迟一个函数或方法(或者当前所创建的匿名函数) 的执行
注意defer语句只能出现在函数或者方法的内部
defer经常被用于处理成对的操作,如打开、关闭、连接、断开连接、加锁、释放锁。通过defer机制,不论函数多复杂,都能保证任何执行路径下,资源被释放。释放资源的defer应该直接跟在请求资源的语句后 闭包好难理解,记得之后再看看