范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Go函数装饰器模式教程

  装饰器在 Python 和 TypeScript 等其他编程语言中肯定更为突出,但这并不是说你不能在 Go 中使用它们。事实上,对于某些问题,使用装饰器是我们希望在本教程中找到的完美解决方案。了解装饰器模式
  装饰器本质上允许您包装现有功能并在顶部附加或添加您自己的自定义功能。
  在 Go 中,函数被视为第一类对象,这本质上意味着您可以像传递变量一样传递它们。让我们用一个非常简单的例子来看看这个:package main  import (   "fmt"   "time" )  func myFunc() {   fmt.Println("Hello World")   time.Sleep(1 * time.Second) }  func main() {   fmt.Printf("Type: %T ", myFunc) }
  所以,在这个例子中,我们定义了一个名为 的函数myFunc,它简单地打印出Hello World。然而,在我们的main()函数体中,我们已经调用fmt.Printf并且我们习惯于%T打印出我们作为第二个参数传入的值的类型。在这种情况下,我们正在传递myFunc,随后将打印出以下内容:$ go run test.go Type: func()
  那么,这对我们 Go 开发人员意味着什么?好吧,它强调了函数可以在我们代码库的其他部分中传递并用作参数的事实。
  让我们通过进一步扩展我们的代码库并添加一个coolFunc()将函数作为其唯一参数的函数来看看这一点:package main  import (   "fmt"   "time" )  func myFunc() {   fmt.Println("Hello World")   time.Sleep(1 * time.Second) }  // coolFunc takes in a function // as a parameter func coolFunc(a func()) {     // it then immediately calls that functino   a() }  func main() {   fmt.Printf("Type: %T ", myFunc)   // here we call our coolFunc function   // passing in myFunc     coolFunc(myFunc) }
  当我们尝试运行它时,我们应该看到我们的新输出具有我们 Hello World期望的字符串:$ go run test.go Type: func() Hello World
  现在,这可能会让您感到有些奇怪。你为什么想做这样的事情?它本质上为您的调用增加了一层抽象,myFunc并使代码复杂化,而没有真正增加太多价值。一个简单的装饰器
  让我们看看如何使用这种模式为我们的代码库添加一些价值。如果需要,我们可以在执行特定函数时添加一些额外的日志记录,以突出显示它的开始和结束时间。package main  import (     "fmt"     "time" )  func myFunc() {   fmt.Println("Hello World")     time.Sleep(1 * time.Second) }  func coolFunc(a func()) {     fmt.Printf("Starting function execution: %s ", time.Now())     a()     fmt.Printf("End of function execution: %s ", time.Now()) }  func main() {     fmt.Printf("Type: %T ", myFunc)     coolFunc(myFunc) }
  调用此命令后,您应该会看到如下所示的日志:$ go run test.go Type: func() Starting function execution: 2018-10-21 11:11:25.011873 +0100 BST m=+0.000443306 Hello World End of function execution: 2018-10-21 11:11:26.015176 +0100 BST m=+1.003743698
  如您所见,我们已经能够有效地包装我的原始函数,而无需更改它的实现。我们现在能够清楚地看到该函数何时启动以及何时完成执行,并且它向我们强调了该函数只需大约一秒钟即可完成执行。现实世界的例子
  让我们再看几个例子,看看我们如何使用装饰器来获得更多的名声和财富。我们将使用一个非常简单的 http Web 服务器并装饰我们的端点,以便我们可以验证传入请求是否具有特定的标头集。
  如果您想了解更多关于在 Go 中编写简单 REST API 的信息,那么我建议您在此处查看我的另一篇文章: 在 Go 中创建 REST APIpackage main  import (     "fmt"     "log"     "net/http" )  func homePage(w http.ResponseWriter, r *http.Request) {     fmt.Println("Endpoint Hit: homePage")     fmt.Fprintf(w, "Welcome to the HomePage!") }  func handleRequests() {     http.HandleFunc("/", homePage)     log.Fatal(http.ListenAndServe(":8081", nil)) }  func main() {     handleRequests() }
  如您所见,我们的代码中没有什么特别复杂的。我们设置了一个net/http 路由器,服务于单个/端点。
  让我们添加一个非常简单的身份验证装饰器函数,它将检查请求Authorized头是否设置为true传入请求。package main  import (     "fmt"     "log"     "net/http" )  func isAuthorized(endpoint func(http.ResponseWriter, *http.Request)) http.Handler {     return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {          fmt.Println("Checking to see if Authorized header set...")          if val, ok := r.Header["Authorized"]; ok {             fmt.Println(val)             if val[0] == "true" {                 fmt.Println("Header is set! We can serve content!")                 endpoint(w, r)             }         } else {             fmt.Println("Not Authorized!!")             fmt.Fprintf(w, "Not Authorized!!")         }     }) }  func homePage(w http.ResponseWriter, r *http.Request) {     fmt.Println("Endpoint Hit: homePage")     fmt.Fprintf(w, "Welcome to the HomePage!") }  func handleRequests() {      http.Handle("/", isAuthorized(homePage))     log.Fatal(http.ListenAndServe(":8081", nil)) }  func main() {     handleRequests() }
  注意:这绝对不是保护 REST API 的正确方法,我建议您考虑使用 JWT 或 OAuth2 来实现该目标!
  所以,让我们分解一下并尝试了解发生了什么!
  我们创建了一个名为的新装饰器函数isAuthorized(),它接收一个与原始homePage函数具有相同签名的函数。然后返回一个http.Handler.
  在我们的isAuthorized()函数体中,我们返回一个 new http.HandlerFunc来验证我们的Authorized header的工作是 set 和 equals true。现在,这是一个大大简化的版本OAuth2身份验证/授权,有一些细微的差异,但它让您大致了解它是如何工作的。
  然而,要注意的关键是我们已经设法装饰现有端点并在所述端点周围添加某种形式的身份验证,而无需更改该功能的现有实现。
  现在,如果我们要添加一个我们想要保护的新端点,我们可以轻松地这样做:// define our newEndpoint function. Notice how, yet again, // we don"t do any authentication based stuff in the body // of this function func newEndpoint(w http.ResponseWriter, r *http.Request) {     fmt.Println("My New Endpoint")     fmt.Fprintf(w, "My second endpoint") }  func handleRequests() {      http.Handle("/", isAuthorized(homePage))   // register our /new endpoint and decorate our   // function with our isAuthorized Decorator   http.Handle("/new", isAuthorized(newEndpoint))     log.Fatal(http.ListenAndServe(":8081", nil)) }
  这突出了装饰器模式的主要优点,在我们的代码库中包装代码非常简单。我们可以使用相同的方法轻松添加新的经过身份验证的端点结论
  希望本教程有助于揭开装饰器的神秘面纱,以及如何在自己的基于 Go 的程序中使用装饰器模式。我们了解了装饰器模式的好处以及如何使用它来用新功能包装现有功能。
  在本教程的第二部分,我们查看了一个更现实的示例,说明如何在自己的生产级 Go 系统中使用它。
  如果您喜欢本教程,请随时广泛分享这篇文章,它确实对网站有帮助,我将不胜感激!如果您有任何问题和/或意见,请在下面的评论部分告诉我!

关注FF电动车骗局调查结束,贾跃亭降薪25,财报何时披露?文懂车帝原创邢秋鸿懂车帝原创行业2月1日,法拉第未来(FaradayFuture,简称FF)宣布,公司董事会特别委员会已完成了此前所宣布的针对不准确披露指控的调查,其中包括去年10存1万送电动车?中国邮政又出新招,值得参与吗?是真的吗?存一万块钱就能够领取一辆电动车,不少人就开始感慨该不会真有这样的事情吧,毕竟一辆电动车便宜点的也得需要一千块钱左右,这可比一万块钱平时能带来的业务高多了。提到金融行业我们首先想到的2k以内想搞一台办公笔记本,有没有大佬推荐一下?非常感谢您的邀请!2000块钱以内的笔记本电脑还是很多的,但是配置能拿得出手,好用的确实不多,大多数的性能和品质都难以保证。2000左右的笔记本电脑只是入门级的配置,低色域接口少,小米第一,vivo第三2021年印度智能手机市场销量出炉IT之家2月1日消息,根据Counterpoint公布的最新数据,印度智能手机市场收入在2021年突破380亿美元,同比增长27。出货量在2021年同比增长11,达到1。69亿部。开卖十个月下跌4400元,12GB512GB,一亿像素三摄旗舰一降再降液态镜头你们听说过吗?接下来的手机行业中将会不断出现配备液态镜头的手机,所谓液态镜头就是由薄膜包裹的透明流体构成类晶状体结构,可以用来代替传统光学镜片,包括苹果华为小米等多家大型手如何让生产环境的JVM在OOM时自动dump内存快照假设知道自己的系统OOM了,咋办?解决OOM的初步思路OOM必然说明系统中某区的对象太多,塞满那个区,而且一定无法回收掉那些对象,最终才导致内存溢出。就得知道到底是什么对象太多了最为什么现在智能手机越来越贵了?不止想赚钱,这几点原因也很真实现在智能手机普及,小到小学生大到老年人都会使用手机,可以说基本上出门在外都是人手一部手机。但是大家发现没有,现在换一部新的手机比起前几年来说,贵了不少。以前一部2000元左右的手机买个15000左右的单反相机有什么推荐?目前微单已经逐渐取代单反。不过,不少人感觉还是单反好,既然你选择了单反,那是个正确的选择。微单现在涨价比较厉害,据说不仅得交定金,而且还拿不到货。单反当下还有货,但是也涨价了,如果2022年中美之间股市对比数字货币对经济的影响2022年中美之间金融决战今年将会是一个怎样的一年?中国的全面注册制落实,美国的加息还有中国的减息。世界将会怎么样?今年肯定会在历史上有一个重要的一年而且还有世界各地对数字货币的态满电跑301公里,低价快充灵巧小型SUV,好养好停车,实拍哪吒N01哪吒N01汽车逐渐成为很多消费者出行不可或缺的代步工具,反观来讲每次用车都得烧油烧钱,因此越来越多消费者为了节省这一笔不小开支,从而选择满足自身使用的新能源纯电动代步车,不仅省钱保2022年春节最值得买的几款手机,价格不高性能强悍,直接买就行新年到,不知道朋友们有没有考虑更换手机的朋友,如果没有做好决定不妨看看妖妖推荐的这几款手机,绝对是目前最值得买的几款手机,个个性能强悍,最关键的是价格不高,想要购机的小伙伴可以做个
落地24万提新款凯美瑞,对比开了5年的A4L,差就差在品牌上很多人第一次买车是非常在意汽车品牌的,尤其是对于年轻人来说,选择一款车除了颜值空间配置等等之外,还极为在意一款车是否会让自己显得倍有面子,当然我也是如此!在5年前买第一辆车时手头并中自科技股权转让纠纷风波再起华西证券旗下金智百业源股权投资基金或申请仲裁财联社(成都,记者崔文官)讯,中自科技(688737。SH)和成都金智百业源股权投资基金的股权纠纷还在继续,昨日晚间公司披露称收到成都市中院的民事裁定书,成都中院裁定驳回成都金智百恒大事件冲击消退10月金融机构对房地产融资恢复正常财联社(北京,记者姜樊高萍)讯,金融机构对房地产企业融资行为正在从恒大事件冲击中回归常态。财联社记者从金融管理部门和多家银行处了解到,10月份房地产贷款投放环比和同比均有较大幅度的不堪重负!又有四家英国能源供应商因天然气价格高企而倒下财联社(上海,编辑卞纯)讯,由于人们担忧俄罗斯会限制对欧洲的天然气供应,英国天然气市场仍高位徘徊。不堪重负的英国能源供应商延续破产潮。英国能源监管机构Ofgem周二表示,又有四家小食品原料成本提升机构建议关注明年提价行情部分食品相关上市公司再度公告上调产品价格,11月2日盘后,恒顺醋业公告对部分产品进行价格调整,调整幅度515不等,海欣食品对部分产品经销价进行上调,调价幅度为310不等。安井食品海国债正式纳入WGBI叠加外资免税政策再延期利好效应助推债市回暖财联社(北京,记者张晓翀)讯,近日中国国债正式纳入富时全球国债指数(WGBI),此外国常会亦决定,将境外机构投资者投资境内债券市场取得的债券利息收入免征企业所得税和增值税政策的实施三季报总结钛白粉企业业绩超预期原材料高位支撑四季度价格财联社(南京,记者贾晓宁)讯,今年以来,钛白粉价格一直处于上涨状态。受此影响,多家钛白粉企业2021年前三季报业绩大幅上涨,超出预期。对此,卓创资讯行业分析师田晓雨对财联社记者表示MPV领域的大乱斗将开始,又一新车要来了,GL8地位难保?相比起SUV或者轿车,MPV车型所占的市场份额就小得多,而且整个MPV领域的市场环境也是非常稳定,像在中低端车市场一般是以五菱宏光S宝骏730凯捷宋MAX吉利嘉际等等自主品牌的车型凭性价比称王,重2。2吨有355Ps,5层玻璃近乎0噪音随着现如今国内消费水平的提升,汽车消费逐渐向着高端化发展。现在很多消费者在选车时已经不仅仅满足于汽车得基本代步功能,所以我们也能看到以前满大街的小型车是越来越少,反观一些注重高品质永和智控5。3亿元剥离流体智控业务转型医疗年底欲再收购两家医院财联社(杭州,记者陈抗)讯,为了彻底转型医疗健康,永和智控(002795。SZ)决定剥离原有流体智控业务,经过七个月时间,公司完成重大资产重组,以5。3亿元转让了子公司。11月2日合资SUV绷不住了,从9。99万跌至6。49万,油耗仅5L现在随着汽车行业逐渐的饱和,在国内汽车市场竞争是愈发激烈,而面对竞争如此激烈的汽车市场,除了加快更新换代的频率以求跟上消费者的消费需求之外,以价换量更是成为了常态,尤其是二三线品牌