GO语言-回调函数、闭包、装饰器模式

回调函数

在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
}

使用匿名函数作为回调函数

  1. 将匿名函数赋值给变量
  2. 高阶函数中直接写匿名函数
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
}

 

闭包

闭包:就是将函数作为返回值,返回的这个函数就是闭包。

常见创建闭包的方式:在一个函数中创建另一个函数。

特性:

  1. 内函数可以访问外函数的变量
  2. 闭包中的变量可以常驻内存中
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函数的情况下,对其新增其他功能(输出了记录日志标识)。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值