游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Go函数装饰器模式教程

  装饰器在Python和TypeScript等其他编程语言中肯定更为突出,但这并不是说你不能在Go中使用它们。事实上,对于某些问题,使用装饰器是我们希望在本教程中找到的完美解决方案。了解装饰器模式
  装饰器本质上允许您包装现有功能并在顶部附加或添加您自己的自定义功能。
  在Go中,函数被视为第一类对象,这本质上意味着您可以像传递变量一样传递它们。让我们用一个非常简单的例子来看看这个:packagemainimport(fmttime)funcmyFunc(){fmt。Println(HelloWorld)time。Sleep(1time。Second)}funcmain(){fmt。Printf(Type:T,myFunc)}
  所以,在这个例子中,我们定义了一个名为的函数myFunc,它简单地打印出HelloWorld。然而,在我们的main()函数体中,我们已经调用fmt。Printf并且我们习惯于T打印出我们作为第二个参数传入的值的类型。在这种情况下,我们正在传递myFunc,随后将打印出以下内容:goruntest。goType:func()
  那么,这对我们Go开发人员意味着什么?好吧,它强调了函数可以在我们代码库的其他部分中传递并用作参数的事实。
  让我们通过进一步扩展我们的代码库并添加一个coolFunc()将函数作为其唯一参数的函数来看看这一点:packagemainimport(fmttime)funcmyFunc(){fmt。Println(HelloWorld)time。Sleep(1time。Second)}coolFunctakesinafunctionasaparameterfunccoolFunc(afunc()){itthenimmediatelycallsthatfunctinoa()}funcmain(){fmt。Printf(Type:T,myFunc)herewecallourcoolFuncfunctionpassinginmyFunccoolFunc(myFunc)}
  当我们尝试运行它时,我们应该看到我们的新输出具有我们HelloWorld期望的字符串:goruntest。goType:func()HelloWorld
  现在,这可能会让您感到有些奇怪。你为什么想做这样的事情?它本质上为您的调用增加了一层抽象,myFunc并使代码复杂化,而没有真正增加太多价值。一个简单的装饰器
  让我们看看如何使用这种模式为我们的代码库添加一些价值。如果需要,我们可以在执行特定函数时添加一些额外的日志记录,以突出显示它的开始和结束时间。packagemainimport(fmttime)funcmyFunc(){fmt。Println(HelloWorld)time。Sleep(1time。Second)}funccoolFunc(afunc()){fmt。Printf(Startingfunctionexecution:s,time。Now())a()fmt。Printf(Endoffunctionexecution:s,time。Now())}funcmain(){fmt。Printf(Type:T,myFunc)coolFunc(myFunc)}
  调用此命令后,您应该会看到如下所示的日志:goruntest。goType:func()Startingfunctionexecution:2018102111:11:25。0118730100BSTm0。000443306HelloWorldEndoffunctionexecution:2018102111:11:26。0151760100BSTm1。003743698
  如您所见,我们已经能够有效地包装我的原始函数,而无需更改它的实现。我们现在能够清楚地看到该函数何时启动以及何时完成执行,并且它向我们强调了该函数只需大约一秒钟即可完成执行。现实世界的例子
  让我们再看几个例子,看看我们如何使用装饰器来获得更多的名声和财富。我们将使用一个非常简单的httpWeb服务器并装饰我们的端点,以便我们可以验证传入请求是否具有特定的标头集。
  如果您想了解更多关于在Go中编写简单RESTAPI的信息,那么我建议您在此处查看我的另一篇文章:在Go中创建RESTAPIpackagemainimport(fmtlognethttp)funchomePage(whttp。ResponseWriter,rhttp。Request){fmt。Println(EndpointHit:homePage)fmt。Fprintf(w,WelcometotheHomePage!)}funchandleRequests(){http。HandleFunc(,homePage)log。Fatal(http。ListenAndServe(:8081,nil))}funcmain(){handleRequests()}
  如您所见,我们的代码中没有什么特别复杂的。我们设置了一个nethttp路由器,服务于单个端点。
  让我们添加一个非常简单的身份验证装饰器函数,它将检查请求Authorized头是否设置为true传入请求。packagemainimport(fmtlognethttp)funcisAuthorized(endpointfunc(http。ResponseWriter,http。Request))http。Handler{returnhttp。HandlerFunc(func(whttp。ResponseWriter,rhttp。Request){fmt。Println(CheckingtoseeifAuthorizedheaderset。。。)ifval,ok:r。Header〔Authorized〕;ok{fmt。Println(val)ifval〔0〕true{fmt。Println(Headerisset!Wecanservecontent!)endpoint(w,r)}}else{fmt。Println(NotAuthorized!!)fmt。Fprintf(w,NotAuthorized!!)}})}funchomePage(whttp。ResponseWriter,rhttp。Request){fmt。Println(EndpointHit:homePage)fmt。Fprintf(w,WelcometotheHomePage!)}funchandleRequests(){http。Handle(,isAuthorized(homePage))log。Fatal(http。ListenAndServe(:8081,nil))}funcmain(){handleRequests()}
  注意:这绝对不是保护RESTAPI的正确方法,我建议您考虑使用JWT或OAuth2来实现该目标!
  所以,让我们分解一下并尝试了解发生了什么!
  我们创建了一个名为的新装饰器函数isAuthorized(),它接收一个与原始homePage函数具有相同签名的函数。然后返回一个http。Handler。
  在我们的isAuthorized()函数体中,我们返回一个newhttp。HandlerFunc来验证我们的Authorizedheader的工作是set和equalstrue。现在,这是一个大大简化的版本OAuth2身份验证授权,有一些细微的差异,但它让您大致了解它是如何工作的。
  然而,要注意的关键是我们已经设法装饰现有端点并在所述端点周围添加某种形式的身份验证,而无需更改该功能的现有实现。
  现在,如果我们要添加一个我们想要保护的新端点,我们可以轻松地这样做:defineournewEndpointfunction。Noticehow,yetagain,wedontdoanyauthenticationbasedstuffinthebodyofthisfunctionfuncnewEndpoint(whttp。ResponseWriter,rhttp。Request){fmt。Println(MyNewEndpoint)fmt。Fprintf(w,Mysecondendpoint)}funchandleRequests(){http。Handle(,isAuthorized(homePage))registerournewendpointanddecorateourfunctionwithourisAuthorizedDecoratorhttp。Handle(new,isAuthorized(newEndpoint))log。Fatal(http。ListenAndServe(:8081,nil))}
  这突出了装饰器模式的主要优点,在我们的代码库中包装代码非常简单。我们可以使用相同的方法轻松添加新的经过身份验证的端点结论
  希望本教程有助于揭开装饰器的神秘面纱,以及如何在自己的基于Go的程序中使用装饰器模式。我们了解了装饰器模式的好处以及如何使用它来用新功能包装现有功能。
  在本教程的第二部分,我们查看了一个更现实的示例,说明如何在自己的生产级Go系统中使用它。
  如果您喜欢本教程,请随时广泛分享这篇文章,它确实对网站有帮助,我将不胜感激!如果您有任何问题和或意见,请在下面的评论部分告诉我!

第一节金属的化学性质(第一课时)教案教学目标1。使学生认识钠是一种很活泼的金属,了解钠的物理性质,掌握钠的化学性质。2。培养学生根据实验现象探究、分析、推理和判断的能力。教学重点钠的性质……二年级上册回乡偶书教学教案教学目标:1、知识与技能:认识2个字,会写三个字。有感情地朗读课文,背诵课文体会诗中的真情。2、过程与方法:创设情境,引导学生自学古诗,在读、想、演中理解诗的意思及……着眼的造句【注音】:zheyan着眼解释【意思】:(从某方面)观察;考虑:点大处,小处下手。着眼造句:1、因此,牧师没有听见任何骚动的征象,便不再捂着眼,并四下张……关于2017年开学第一课主题班会教案只有不断的改变自己和自己不断的改变,才能在激烈的竞争中占得先机,教育也是如此。那么,开学第一课的主题班会怎么准备一份新颖的教案呢?下面是小编为你整理的2017年开学第一课主题班……美图斥资5000万美元再次购买比特币和以太币IT之家3月17日消息今天,美图发布公告称,董事会欣然宣布,全资子公司MiracleVision于2021年3月17日根据加密货币投资计划在公开市场交易中进一步购买了16,00……食物从何处来阅读答案一种叫自养。绿色植物都属于这一类。它们自己把无机物制造成有机的食物,满足生长的需要。绿色开花的植物有庞大得惊人的根系。每条根的尖端都有很多根毛。每一个根毛就是一个最基层的……调查美国居民收到的纾困救助金可能被用来购买比特币3月16日消息,据国外媒体报道,最近美国众议院通过了一项经济刺激计划,政府将抛出1。9万亿美元用于疫情冲击下的经济救济。预计许多美国人将收到1400美元救助金,新调查显示,其中……云房子说课稿教材分析:《云房子》是苏教版二年级上册第八单元的一篇童话故事。全文采用拟人化的手法描绘了雨后天空的景色。有云时,云朵千姿百态、逗人喜爱,没云时,天空更显洁净艳丽。另外,天……印度向特斯拉示好若在国内生产汽车,可提供最优惠条件北京时间3月2日晚间消息,据报道,印度交通部长尼廷加德卡里(NitinGadkari)今日表示,如果特斯拉承诺在印度生产电动汽车,则印度将为其提供激励措施。数周前,特斯拉……上汽集团和腾讯签署战略协议,共建网络安全联合实验室IT之家4月8日消息根据腾讯官方的消息,今天,上汽集团和腾讯签署战略协议,宣布共建网络安全联合实验室。双方围绕智能网联汽车网络安全标准规范、攻防技术、安全研发、安全运营等领域开……全国将开展断卡行动,严打非法开办贩卖电话卡银行卡IT之家10月10日消息根据公安部刑侦局的消息,国务院打击治理电信网络新型违法犯罪工作部际联席会议全国断卡行动部署会10日召开,公安部副部长杜航伟表示非法开办贩卖电话卡、银行卡……礼物成诱饵骗子骗取4000人身份证信息,注册2万余张手机卡IT之家11月22日消息据公安部刑侦局官微消息,近日,四川宜宾警方侦破一起侵犯公民个人信息案,犯罪团伙骗取了4000余人的身份证信息并用来注册了2万多张手机卡,用于非法业务等。……
初三语文简答默写复习资料汇编(特此说明:该资料是主要在山东光远中学王新伟所编《山东光远中学》的基础上进一步改编而成。敬请原文作者谅解。)第一册部分1。不必说碧绿的菜畦,光滑的石井栏,高大的皂荚……小学生一年级数学暑假作业练习1、小力今年6岁,小力的奶奶说等小力9岁的时候奶奶就55岁了,那么奶奶今年岁。2、20个小朋友报数,单数一行,双数一行。单数第5个数是号,双数第10个数是号。天平板……滴滴高管澄清烟台猥亵男子非滴滴司机别再向他们泼脏水6月29日晚间消息,今日有媒体报道称,6月13日凌晨3点多山东烟台一位女士在家门口遭到一位陌生男子袭胸猥亵。事后经过警方调查,锁定嫌疑人为衣某海,此前因盗窃、抢夺、猥亵三次被判……涉黄评论骚扰用户,微博关注博主7天以上才能评论IT之家6月12日消息6月12日消息,微博发布公告称,6月12日22时起,用户发布评论,须关注博主7天以上,但博主已经设置我关注的人可评论自己的除外。本次调整为期7天。微……为了打败张一鸣,马化腾想让腾讯收下爱奇艺马云没有按照王兴所想放弃阿里大文娱,李彦宏却可以要放弃爱奇艺了,接手的还是马化腾。路透社报道称,腾讯已经与拥有56。2爱奇艺股权的百度进行接洽,计划成为爱奇艺最大股东。……腾讯正式上线社交App有记在2019,风口十分稀缺,但社交新品却层出不穷。从年初披着网红外衣的马桶MT、多闪、聊天宝同时面世,打开了2019年社交棋局,再到baidu推出主打校园匿名社交的听筒,网……阿长与山海经教学反思回顾品味是一种收获,在反思中进步,讲课也是这样。下面是小编为你整理的阿长与山海经教学反思,希望能够帮助到你!阿长与山海经教学反思(一)《阿长与〈山海经〉》是人教版八……董明珠建议给新技术标准开设绿色通道IT之家5月25日消息今日午间,董明珠自媒体发布微博称时代在进步,企业出现了很多自己创造的新技术。这种技术不仅中国没有,甚至世界也没有,那么相关的标准在哪里?国家标准滞后,会带……从一年级到十二年级现代文阅读及答案阅读实践(一)从一年级到十二年级一定是发生了什么,它不仅是青春期的问题。我猜测它部分是因为来自同学的不许杰出的压力(除了在体育运动中),部分是因为社会教给人们的短期……11月1日11日0点9分,京东双十一累计下单金额突破2000根据京东官方数据显示,2020年11月1日00:00至11月11日00:09,京东11。11全球热爱季累计下单金额已经突破2000亿元。据介绍,10月21日起京东11。1……蚂蚁集团发信致歉上市计划暂缓,将妥善处理好后续工作IT之家11月3日消息今晚,上交所称由于蚂蚁集团近日实际控制人、董事长及总经理被相关部门联合约谈,根据相关规定将暂缓蚂蚁集团上市程序。之后,港交所也发布公告,暂缓蚂蚁集团上市。……美国制裁俄罗斯研究机构,理由开发危险恶意软件据报道,上周五华盛顿对俄罗斯一家研究机构实施了制裁,理由是该研究机构涉及有关可造成灾难性工业损失的危险计算机程序开发。对此,俄罗斯称该制裁不合法。美国财政部声称,俄罗斯政……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网