Hello,各位小伙伴你们好,我是小栈君。上一期咱们讲到了关于函数的有参、无参、匿名函数,本期咱们分享一下关于go语言函数类型、匿名函数和闭包的概念和实战。闲话很少说,立马开始分享。java
在Go语言中,函数也是一种数据类型,咱们能够经过type来定义它,它的类型就是全部拥有相同的参数,相同的返回值的一种类型。闭包
//IT干货栈,天天分享IT干货 // 定义一个函数类型 --求和 type FunctionType func(a, b int) (num int) //声明一个函数类型, func后面没有函数名 //在函数中传参中咱们有一个参数为函数类型的 func Calc(a, b int, functionType FunctionType) (num int) { return functionType(a, b) } func Add(a, b int) (sum int) { sum = a + b return } func Abs(a, b int) int { return a - b } func main() { num := Calc(1, 2, Add) fmt.Println("求和计算结果--》", num) calc := Calc(3, 2, Abs) fmt.Println("求差计算结果", calc) functionType := Add i := Calc(4, 5, functionType) fmt.Println(i) }
因此在Go语言中,咱们不单单使用的是变量,常量,对象等,也是可使用函数类型进行传参,这个传参是多种多样的。函数
函数之匿名函数和闭包学习
匿名函数就是一种不须要定义函数名的函数。在Go语言里,全部的匿名函数(Go语言规范中称之为函数字面量)都是闭包。大数据
匿名函数是指不须要定义函数名的一种函数实现方式,它并非一个新概念,最先能够回溯到1958年的Lisp语言。其中咱们写一个简单的例子人工智能
只是将一个匿名函数赋值给一个变量f ,而后进行执行,固然最后的结果就是4啦~code
固然关于匿名函数的定义是能够分不少种的。对象
舒适提示,千万别忘记后面的括号。此处是直接调用匿名函数并进行传参。blog
所谓闭包就是一个函数“捕获”了和它在同一做用域的其它常量和变量。这就意味着当闭包被调用的时候,无论在程序什么地方调用,闭包可以使用这些常量或者变量。生命周期
它不关心这些捕获了的变量和常量是否已经超出了做用域,因此只有闭包还在使用它,这些变量就还会存在。
如图所示,咱们能够看到在外部定义了i为1 ,str是“it小栈君”,可是在匿名函数内部咱们将变量从新赋值后。内部和外部都成为了100和go了。
因此由此可知函数闭包是以引用的方式捕获外部变量。可能这样说仍是太深奥了,那么小栈君这边也是经过几个示例给你们解释一下吧。
咱们首先定义了个普通的函数,并无初始化开始的值,只有当函数被调用的时候才进行值的初始化,分配空间为0。当函数调用完毕后函数值就会被释放。因此咱们获得的值就一直是2。
可是若是咱们将函数类型设定成返回一个匿名函数,业务逻辑不改变的前提下,如图所示:
如图所示,咱们将add2设置成返回一个匿名函数,在匿名函数中有相同的业务逻辑就是a进行自加一后,而后进行相加。
咱们经过f来进行调用返回函数,在进行调用闭包函数。以前有句话说的“它不关心这些捕获了的变量和常量是否已经超出了做用域,因此只有闭包还在使用它,这些变量就还会存在。”
只要函数还在调用(f()),那么它就一直存在,然而普通函数调用后就直接释放掉了。对add2的一次调用会生成一个局部变量a并返回一个匿名函数。
每次调用时匿名函数时,该函数都会先使a的值加1,再返回a的和。第二次调用add2时,会生成第二个a变量,并返回一个新的匿名函数。新匿名函数操做的是第二个a变量。
经过这个例子,咱们看到变量的生命周期不禁它的做用域决定:add2返回后,变量a仍然隐式的存在于f中。
因此各位小伙伴也要尽可能掌握关于匿名函数和闭包的概念哦,今天的分享就到这里啦,若是你喜欢个人分享,麻烦你点击收藏、分享或再看。让更多的小伙伴加入咱们的学习阵营中来。
这里天天会分享包含java,go,Python,大数据,人工智能的相关干货,咱们一块儿提升,一块儿进步。我是小栈君,咱们明天再见,拜了个拜。
本文由博客一文多发平台 OpenWrite 发布!