在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有语法糖,只能手动赋值给同名变量。
关于装饰器的作用和Python如何实现装饰器,可参考另一篇文章Python-装饰器_一边学习一边哭的博客-CSDN博客概述在讲装饰器之前,要引入一个面向对象的核心原则——“开发封闭原则”。开放封闭原则主要体现在两个方面:对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。对于python中的已经完成的函数。我们应该不要对已有函数本身直接进行修改,但是我们仍然在需要新的功能时对其进行扩展。装饰器的格式在需要被装饰的函数上一行添加:@decorator_name一个简单的装饰器可以https://blog.csdn.net/qq522044637/article/details/121525002
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函数的情况下,对其新增其他功能(输出了记录日志标识)。



