Golang Go语言中好像没办法实现一个支持递归的装饰器

Golang Go语言中好像没办法实现一个支持递归的装饰器
不知道用反射行不行

5 回复

https://gist.github.com/Petelin/a7bf8ccfd657536d46aaa355c6dc421a

只能写成这样了, 想要和 oom 一样的效果就得一层 wrap 一层

更多关于Golang Go语言中好像没办法实现一个支持递归的装饰器的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


打不开,可否直接贴下代码。

可以的,不过被包装的函数需要定义成变量,这样递归调用时,用的就是包装后的了。
下面的 fib 函数里面的 fib(n-1),表示的是 fib 变量,而 fib 变量是已经包装过的了。
普通的函数就做不到。

https://gist.github.com/reusee/b9a447e3d00d5ae59bfecc01222073ee

https://zhuanlan.zhihu.com/p/89843645 写到了知乎里

两种方法, 一种是 interface, 一种是 function var

在Go语言中,虽然标准库没有直接提供一个支持递归的装饰器(Decorator)模式,但我们可以通过一些技巧来实现类似的功能。

装饰器模式通常用于在不修改原有函数或方法定义的情况下,为其添加额外的行为。在Go中,函数可以作为一等公民传递,这使得实现装饰器成为可能。

对于递归装饰器,关键在于确保装饰器能够正确地调用被装饰的递归函数,并且能够在每次递归调用时都应用装饰逻辑。这通常意味着装饰器需要维护一个对原始函数或递归基准情况的引用。

一种实现方法是使用闭包来封装原始函数和装饰逻辑。闭包可以捕获并存储其外部作用域中的变量,这使得在递归调用中保持对原始函数的引用变得可能。

例如,你可以定义一个递归装饰器函数,它接受一个原始函数和一个装饰逻辑函数作为参数,并返回一个新的函数。这个新函数在调用时会先执行装饰逻辑,然后递归地调用原始函数(或自己,如果逻辑上需要)。

需要注意的是,递归装饰器可能会导致栈溢出或性能问题,特别是在深度递归的情况下。因此,在实现时应该仔细考虑递归的基准情况和可能的优化策略。

总之,虽然Go标准库没有直接提供递归装饰器,但通过使用闭包和函数作为一等公民的特性,我们可以灵活地实现这一模式。

回到顶部