在Go语言中,函数也是一种数据类型,我们可以通过 type 来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型。
语法
通过type给函数类型起名,然后通过名字进行函数的调用
- 好处:多态
- 通过统一的调用接口去实现不同的功能,函数可以进行扩展。
匿名函数和闭包
所谓闭包就是一个函数“捕获”了和它在同一作用域的其它常量和变量。这就意味着当闭包被调用的时候,不管在程序什么地方调用,闭包能够使用这些常量或者变量。它不关心这些捕获了的变量和常量是否已经超出了作用域,所以只要闭包还在使用它,这些变量就还会存在。
在 Go 语言里,所有的匿名函数(Go 语言规范中称之为函数字面量)都是闭包。匿名函数是指不需要定义函数名的一种函数实现方式,它并不是一个新概念,最早可以回溯到 1958年的LIsp语言。
闭包函数
声明在一个函数中的函数,叫做闭包函数。
匿名函数
-
:=
可以自动推导类型 -
可以定义匿名函数的同时调用函数。定义了匿名函数,一定要进行调用,否则会报错。
-
也可以同时传参
-
有参有返回值
闭包捕获外部函数的特点
- 闭包是以引用的方式捕获外部变量。在闭包内,修改外部变量的值,相当于把外部变量的值也修改了。
- 普通函数内部的变量,只有在函数被调用时,x才分配空间,如果没有初始化就初始化值为0,函数调用完毕以后,就自动释放。
- 但是闭包不关心捕获变量和常量是否已经超出作用域,只要闭包还在,这些变量就会存在。
闭包的特点
-
让外部访问函数内部变量成为可能;
-
局部变量会常驻在内存中;
-
可以避免使用全局变量,防止全局变量污染;
-
会造成内存泄漏(有一块内存空间被长期占用,而不被释放)