Go 语言编程模式实战
陈皓
网名“左耳朵耗子”,资深技术专家
21556 人已学习
免费领取
Go 语言编程模式实战
15
15
1.0x
00:00/00:00
登录|注册

07 | Go编程模式:修饰器

你好,我是陈皓,网名左耳朵耗子。
之前,我写过一篇文章《Python 修饰器的函数式编程》,这种模式可以很轻松地把一些函数装配到另外一些函数上,让你的代码更加简单,也可以让一些“小功能型”的代码复用性更高,让代码中的函数可以像乐高玩具那样自由地拼装。
所以,一直以来,我都对修饰器(Decoration)这种编程模式情有独钟,这节课,我们就来聊聊 Go 语言的修饰器编程模式。
如果你看过我刚说的文章,就一定知道,这是一种函数式编程的玩法——用一个高阶函数来包装一下。
多唠叨一句,关于函数式编程,我之前还写过一篇文章《函数式编程》,这篇文章主要是想通过详细介绍从过程式编程的思维方式过渡到函数式编程的思维方式,带动更多的人玩函数式编程。所以,如果你想了解一下函数式编程,那么可以点击链接阅读一下这篇文章。其实,Go 语言的修饰器编程模式,也就是函数式编程的模式。
不过,要提醒你注意的是,Go 语言的“糖”不多,而且又是强类型的静态无虚拟机的语言,所以,没有办法做到像 Java 和 Python 那样写出优雅的修饰器的代码。当然,也许是我才疏学浅,如果你知道更多的写法,请你一定告诉我。先谢过了。

简单示例

我们先来看一个示例:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了Go语言中的修饰器编程模式,通过高阶函数将一些函数装配到另外一些函数上,提高代码简洁性和功能复用性。文章通过多个示例展示了修饰器模式的应用,包括计算运行时间、添加HTTP响应头、认证Cookie等功能。此外,还介绍了如何构建多个修饰器的Pipeline来优化代码结构。作者还提到了Go语言的函数式编程特点,以及对修饰器模式的一些思考和提醒。文章指出修饰器模式在Go语言中的应用为读者提供了一种新的编程思路和实践方式。同时,作者也提到了Go语言中修饰器模式的一个小问题,即无法做到泛型,但通过反射机制可以实现比较通用的修饰器。总的来说,本文通过详细的示例和解释,向读者展示了Go语言中修饰器模式的应用和特点,为读者提供了一种新的编程思路和实践方式。

该试读文章来自《Go 语言编程模式实战》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • davix
    後例就是http middleware
    2021-05-07
    6
  • kylin
    // 装饰器模式的等价实现 LogVisitor := func(fn VisitorFunc) VisitorFunc { return func(info *Info, err error) error { fmt.Println("LogVisitor() before call function") err = fn(info, err) if err == nil { fmt.Printf("==> Name=%s, NameSpace=%s\n", info.Name, info.Namespace) } fmt.Println("LogVisitor() after call function") return err } } NameVisitor := func(fn VisitorFunc) VisitorFunc { return func(info *Info, err error) error { fmt.Println("NameVisitor() before call function") err = fn(info, err) if err == nil { fmt.Printf("==> Name=%s, NameSpace=%s\n", info.Name, info.Namespace) } fmt.Println("NameVisitor() after call function") return err } } OtherVisitor := func(fn VisitorFunc) VisitorFunc { return func(info *Info, err error) error { fmt.Println("OtherThingsVisitor() before call function") err = fn(info, err) if err == nil { fmt.Printf("==> OtherThings=%s\n", info.OtherThings) } fmt.Println("OtherThingsVisitor() after call function") return err } } var v2 Visitor v2 = NewDecoratedVisitor(&info, LogVisitor, NameVisitor, OtherVisitor) v2.Visit(loadFile)
    2022-04-02
  • 不敢恭维
    这些东西都是在写代码和看源码的时候很熟悉的东西, 但都没有像作者这样深入地去想它里面蕴含的设计模式以及可延伸到的编程模式, 所以, 真正的大牛还是需要不断修炼, 受教了
    2021-12-27
  • 东方奇骥
    上手练习了一下,老师的文章写得真不错。希望能出更多Go相关的东东。
    2021-01-23
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部