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

03 | Go 编程模式:Functional Options

你好,我是陈皓,网名左耳朵耗子。
这节课,我们来讨论一下 Functional Options 这个编程模式。这是一个函数式编程的应用案例,编程技巧也很好,是目前 Go 语言中最流行的一种编程模式。
但是,在正式讨论这个模式之前,我们先来看看要解决什么样的问题。

配置选项问题

在编程中,我们经常需要对一个对象(或是业务实体)进行相关的配置。比如下面这个业务实体(注意,这只是一个示例):
type Server struct {
Addr string
Port int
Protocol string
Timeout time.Duration
MaxConns int
TLS *tls.Config
}
在这个 Server 对象中,我们可以看到:
要有侦听的 IP 地址 Addr 和端口号 Port ,这两个配置选项是必填的(当然,IP 地址和端口号都可以有默认值,不过这里我们用于举例,所以是没有默认值,而且不能为空,需要是必填的)。
然后,还有协议 ProtocolTimeoutMaxConns 字段,这几个字段是不能为空的,但是有默认值的,比如,协议是 TCP,超时30秒 和 最大链接数1024个。
还有一个 TLS ,这个是安全链接,需要配置相关的证书和私钥。这个是可以为空的。
所以,针对这样的配置,我们需要有多种不同的创建不同配置 Server 的函数签名,如下所示:
func NewDefaultServer(addr string, port int) (*Server, error) {
return &Server{addr, port, "tcp", 30 * time.Second, 100, nil}, nil
}
func NewTLSServer(addr string, port int, tls *tls.Config) (*Server, error) {
return &Server{addr, port, "tcp", 30 * time.Second, 100, tls}, nil
}
func NewServerWithTimeout(addr string, port int, timeout time.Duration) (*Server, error) {
return &Server{addr, port, "tcp", timeout, 100, nil}, nil
}
func NewTLSServerWithMaxConnAndTimeout(addr string, port int, maxconns int, timeout time.Duration, tls *tls.Config) (*Server, error) {
return &Server{addr, port, "tcp", 30 * time.Second, maxconns, tls}, nil
}
因为 Go 语言不支持重载函数,所以,你得用不同的函数名来应对不同的配置选项。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Go 编程模式:Functional Options 本文介绍了Go语言中流行的一种编程模式——Functional Options。文章首先讨论了配置选项问题,指出了在Go语言中由于不支持函数重载而需要使用不同函数名来应对不同配置选项的问题。接着介绍了使用配置对象的方案,以及Builder模式的应用。然后,重点介绍了Functional Options的使用方式,通过定义函数类型和一组函数,实现了高度整洁和优雅的对象配置方式。最后,总结了Functional Options带来的6个好处,并推荐读者在类似的代码中使用这种方式。 Functional Options的优点包括直觉式的编程、高度的可配置化、易于维护和扩展、自文档、易于上手以及消除了配置参数选择困难的问题。通过本文的阅读,读者可以快速了解Functional Options的使用方式及其优势,为提高代码的可读性和可维护性提供了有益的参考。 文章链接:https://studygolang.com/articles/34389

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

全部留言(19)

  • 最新
  • 精选
  • 小明
    通俗易懂给老师点赞,但是我还是想说下,为啥我觉得builder模式更好,因为输入点后,会有提示哪些with选项可以用,函数式的optional 就没有提示
    2021-01-09
    6
    18
  • 余先生嗨全天哈最幸福的人
    可以说是很经典的设计模式了,基本上所有的开源库都可以看到类似方式的处理配置,值得学习和借鉴。
    2021-01-21
    12
  • Geek_2c36c4
    之前看过类似的代码,当时觉得很别扭,看不太懂,原来是这样啊!get了新知识。不过说实话,这个挺难理解的,"新来的人很容易上手" 这个优势不明显
    2021-01-14
    8
  • Geek_cd4ae5
    WithOption 让代码清晰明了~
    2021-01-19
    4
  • onmyway
    666,看到很多函数使用使用这种变参方式,一直不太明白啥意思,也没仔细研究过。今天终于明白了。
    2021-01-15
    2
  • codewu
    在项目经常用
    2021-01-10
    1
  • Direction
    讲得好棒啊,在看源码时,也有很多人模仿java的builder模式,Functional Options模式还是挺好的。
    2021-01-09
    1
    1
  • 橙子888
    打卡。
    2021-01-08
    1
  • 森林木
    这种方式确实很清晰 不过在思考一个问题,怎么防止这些函数被滥用,builder的模式可以保证只在构造阶段被使用。
    2023-06-04归属地:上海
  • 陈麒文
    温故而知新
    2022-11-08归属地:福建
收起评论
显示
设置
留言
19
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部