Go 语言入门指南(四) | 青训营

42 阅读2分钟

函数类型

函数也是一种数据类型,我们可以通过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应该直接跟在请求资源的语句后 闭包好难理解,记得之后再看看