匿名函数,相信大家都不陌生,多多少少在项目中有遇到过,今天看到一个文章,便想彻底搞懂匿名函数到底是什么,用在哪里,怎么使用
构造
匿名函数的构造和普通函数差不多,只是没有名字
func (a,b int) (num int) {
// 函数体
}
基本使用方法
匿名函数完全可以当作一个类型,可以直接赋值,可以赋值给变量,可以当作实参或者返回值进行使用,当然也可以直接进行调用
// 直接赋值
sum := func(a,b int) int {
return a + b
}
// 作为变量使用
func getSum(f func(int, int) int, a, b int) int {
return f(a,b)
}
// 这段代码啥意思嘞,首先是将匿名函数当作一个类型传入函数getSum中
// 并且这个匿名函数的名字是f,同时还传入了a和b两个变量
// 之后返回a和b的和,因为f是参数,所以可以在函数内部调用
// 作为实参使用(回调函数)
// 让我们借用一下上面的函数
getSum(func(x, y int) int {
sum := x + y
fmt.Println("The Sum is", sum)
return sum
}, 1, 2)
// 解释一下这一串代码,首先我们利用上面定义的函数
// 传入一个匿名函数,两个变量
// 匿名函数中,输出了两个变量的值
// 作为返回值使用
func compute(op string) func(int, int) int {
swich op {
case "add":
return func(a, b int) int {
return a + b
}
case "sub":
return func(a, b int) int {
return a - b
}
default:
return nil
}
}
// 通过不同的参数判断使用不同的匿名函数
用在什么地方
回调函数
为啥要用回调函数呢,我们分析一下,A是主函数,B作为参数传递给主函数,我们可以通过上面的例子看到,我们在定义主函数的时候,只定义了函数B的参数以及返回值类型,那么只要函数B满足我们定义的类型,函数A都可以处理,所以说使用回调函数可以让我们主函数的通用性更强。在通俗点来说,主函数提供了一个接口,只要符合这个接口规则的函数都能用。
type Callback func(a, b int) int
// 提供接口,外部随便怎么搞,只要符合规则就行
func api(x,y int, callback Callback) int {
return callback(x, y)
}
// 回调函数,只要满足传入参数类型为int
// 并且返回值类型也是int就都可以
func add(a, b int) int {
return a + b
}
闭包
闭包是啥,闭包是由函数和与其相关的引用环境组合而成的实体。
func add() func(int) int {
var b int
return func(a int) int {
b = b + a
return b
}
}
var f = add()
这里f就是一个闭包,f保存了对b的引用,简单来说f里面有个指针指向b的地址,所以说我们可以得到以下结果
fmt.Println(f(1)) // 由于b初始化为0,所以输出1
fmt.Println(f(2)) // 由于上一行代码已经修改了b的值,所以输出4
所以说闭包就是相当于在我们函数内部使用匿名函数处理好有关变量的所有事情
欢迎大家在评论区讨论,我都会一一回复,店长去忙去了,大家注意戴口罩嗷~