当前位置: 首页 > 面试题库 >

Go中的装饰器功能

萧麒
2023-03-14
问题内容

装饰器模式(功能)有很多好处:

当一个方法具有许多正交的关注点时,这将非常有用…也就是说,这些关注点均不相关,除了我们每次调用我们的方法时都希望全部(或部分)关注它们。这是装饰器模式真正有用的地方。

通过实现装饰器模式,我们订阅了开闭主体。我们的方法对将来的扩展开放,但对将来的修改不开放。遵循开放-封闭原则有很多有趣的好处。

但是,我发现的所有示例都非常复杂(例如,编写带有许多中间件的HTTP服务器)。这使我很难在其他地方应用该原则。我需要可以轻松尝试的东西,以便将我的头缠住它。

有人可以给我一个更简单的示例,它可以最好地说明如何在Go中执行装饰器模式(功能)吗?

Alex
Alehano的这个示例
太简单了,无法投入实际使用。我需要一些可以说明这一点的东西:

func Decorate(c Decorated, ds ...Decorator) Decorated {
    decorated := c
    for _, decorate := range ds {
        decorated = decorate(decorated)
    }
    return decorated
}

根据不同的选项/指令(例如,从上到下,到base64等)进行字符串操作将是IMO的最佳示例,并且还要添加前缀/后缀,因为“
如果装饰器本身已参数化,则此技术特别有用
”。


问题答案:

首先,装饰器基本上是一个函数,该函数将特定类型的另一个函数作为其参数,并返回相同类型的函数。这实际上使您可以创建功能链。所以在Go中看起来像这样:

// this is the type of functions you want to decorate
type StringManipulator func(string) string

// this is your decorator.
func ToLower(m StringManipulator) StringManipulator {
    return func(s string) string {
        lower := strings.ToLower(s)
        return m(lower)
    }
}

这是一个更完整的例子



 类似资料:
  • 问题内容: 是否可以为Go中的任意函数创建一个包装程序,该包装程序将使用相同的参数并返回相同的值? 我不是在说看起来完全一样的包装器,看起来可能有所不同,但是应该可以解决问题。 例如,问题可能是创建一个任意函数的包装,该包装首先在缓存中查找函数调用的结果,并且仅在缓存未命中的情况下执行包装的函数。 问题答案: 答案基于@ joshlf13的想法和答案,但对我来说似乎更简单。 http://play

  • 问题内容: 我希望仅当登录用户具有所需的权限级别时,其他功能才可执行。 为了使我的生活更加复杂,我想使用装饰器。下面,我尝试在“装饰”功能上设置属性-如下所示。 但是当我这样做时: 我得到一个错误 我想念什么? 问题答案: 您正在检查内部(包装)函数上的属性,但在原始(包装)函数上进行了设置。但是,您 根本 需要包装函数: 你的装饰需要返回 的东西 那将取代原有的功能。原始函数本身(添加了属性)可

  • Django为视图提供了数个装饰器,用以支持相关的HTTP服务。 允许的HTTP 方法 django.views.decorators.http 包里的装饰器可以基于请求的方法来限制对视图的访问。若条件不满足会返回 django.http.HttpResponseNotAllowed。 require_http_methods(request_method_list)[source] 限制视图只能

  • 装饰器(Decorators)(被babel支持, 在 03/17 之后作为stage-2的proposal被引入) 如果你在使用类似于mobx的库, 你能够使用装饰器装饰你的函数. 装饰器本质上其实就是将组件传入一个函数. 使用装饰器能让组件更灵活,更可读并且更易修改组件的功能. 不使用装饰器的例子 class ProfileContainer extends Component { //

  • 上一篇文章将通过解决一个需求问题来了解了闭包,本文也将一样,通过慢慢演变一个需求,一步一步来了解 Python 装饰器。 首先有这么一个输出员工打卡信息的函数: def punch(): print('昵称:两点水 部门:做鸭事业部 上班打卡成功') punch() 输出的结果如下: 昵称:两点水 部门:做鸭事业部 上班打卡成功 然后,产品反馈,不行啊,怎么上班打卡没有具体的日

  • fabfile 中可以方便使用的装饰器。 fabric.decorators.hosts(*host_list) 该装饰器用于指定被装饰的函数执行在那台主机或哪些主机列表上。 例如:如果不在控制台覆盖相关参数的话,将会在 host1、host2 以及 host3 上执行 my_func,并且在 host1 和 host3 上都指定了登录用户。 @hosts('user1@host1', 'host