1. 用type关键字可以定义函数类型,函数类型变量可以作为函数的参数或返回值。
package main
import "fmt"
func add(a, b int) int {
return a + b
}
func sub(a, b int) int {
return a - b
}
type Task func(int, int) int
func exec(t Task, a, b int) int {
return t(a, b)
}
func main() {
a := exec(add, 10, 20)
fmt.Println(a)
b := exec(sub, 100, 95)
fmt.Println(b)
}
解析:type Task func(int, int) int,这句是说,使用type关键字定义1个类型为func的Task,这个func有2个int形参、1个int返回值。再看exec这个函数,它有3个形参,形参t的类型是刚定义的函数类型Task,另外两个你懂的,我就不说了。
2. 匿名函数的玩法是真的骚,看看骚在哪里
func work(f func(int, int) int, a, b int) int {
return f(a, b)
}
func add(a, b int) int {
return a + b
}
func main() {
a := work(add, 100, 200)
fmt.Println(a)
}
输出:
300
解析:形参f的类型就是匿名函数,继续看func(int, int) int,这个匿名函数接收两个int形参,返回值也是int类型。另外两个形参a和b,也是int,想必你懂了,我就不废话了。
3. 匿名函数和延迟调用
延迟调用的规则是:按照先进后出的顺序,也就是说函数返回前是会被执行的,而且是按照先进后出的顺序。如何起到延迟的效果,是需要注册的,可通过defer关键字进行注册。那么什么场景下需要用到延迟调用呢?比如常见的场景:当一个函数被即将执行完后,也就是完成任务的最后一刻,需要回收和释放某些资源。
延迟调用的机制可以配合匿名函数来使用,这样就可以让匿名函数被直接调用,只能说是真的骚。
先看个小栗子:
package main
import "fmt"
func work() bool {
fmt.Println("函数开始工作...")
defer func() {
fmt.Println("回收相关资源工作开始!")
}()
defer func() {
fmt.Println("清理工作开始!")
}()
fmt.Println("函数正在工作...")
fmt.Println("函数工作完毕...")
return true
}
func main() {
status := work()
fmt.Println(status)
}
输出:
函数开始工作...
函数正在工作...
函数工作完毕...
清理工作开始!
回收相关资源工作开始!
true
在上面的栗子中,定义了个work函数,先看看输出的结果,感受下。在work函数中,注册了两个延迟调用,work函数从开始->正在->完毕,结束后才执行defer注册的匿名函数,这里要着重注意延迟调用规则:先进后出,也就是先注册后执行。“回收相关资源工作”是先注册的,他的执行顺序排在了“清理工作”的后面。感受到了吗?
最后说明一下:defer关键字让匿名函数实现了可直接调用,那么使用defer注册延迟调用时要注意,defer关键字的后面一定是要函数或方法的调用,不能直接写语句哦。
本文转载于(喜欢的盆友关注我们):https://mp.weixin.qq.com/s/DtSWp-APaAPmTG1mjAMRQQ
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。