回调函数
在go语言中,可以将一个函数作为另一个函数的参数。如:将func1()函数作为func2函数的参数。
fun2()就是高阶函数;fun1()就是回调函数。
func main() {
fmt.Println(func2(1, 2, func1))
}
func func1(a, b int) int {
return a + b
}
func func2(a, b int, fun func(int, int) int) int {
res1 := fun(a, b)
return res1
}
使用匿名函数作为回调函数
- 将匿名函数赋值给变量
- 高阶函数中直接写匿名函数
func main() {
//1.将匿名函数赋值给变量
func1 := func(a, b int) int {
res := a + b
return res
}
fmt.Println("匿名函数作为回调函数1:", func2(1, 2, func1))
//2.高阶函数中直接写匿名函数
res := func2(2, 3, func(a, b int) int {
return a * b
})
fmt.Println("匿名函数作为回调函数2:", res)
}
func func2(a, b int, fun func(int, int) int) int {
res1 := fun(a, b)
return res1
}
闭包
闭包:就是将函数作为返回值,返回的这个函数就是闭包。
常见创建闭包的方式:在一个函数中创建另一个函数。
特性:
- 内函数可以访问外函数的变量
- 闭包中的变量可以常驻内存中
func main() {
res := closure()
fmt.Println("第1次执行, i:", res())
fmt.Println("第2次执行, i:", res())
fmt.Println("第3次执行, i:", res())
}
func closure() func() int {
i := 0
fun := func() int {
i++
return i
}
return fun
}
GO语言设计模式-装饰器模式
在GO语言中实现装饰器,不像Python有语法糖,只能手动赋值给同名变量。
go语言中实现装饰器
type logFunc func(msg string)
func main() {
mytest := decoratorFunc(mytest)
mytest("hello")
}
func mytest(msg string) {
fmt.Println(msg)
}
func decoratorFunc(fun logFunc) logFunc {
logFun := func(msg string) {
fmt.Println("---开始记录日志---")
fun(msg)
fmt.Println("---日志记录结束---")
}
return logFun
}
原本mytest函数只是简单输出信息。遵循开放封闭原则,在不修改mytest函数的情况下,对其新增其他功能(输出了记录日志标识)。