左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家
180940 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 119 讲
左耳听风
15
15
1.0x
00:00/00:00
登录|注册

109 | Go编程模式:Functional Options

Build 方法
WithTLS 方法
WithTimeOut 方法
WithMaxConn 方法
WithProtocol 方法
Create 方法
Conf
Port
Addr
TLS
MaxConns
Timeout
Protocol
NewTLSServerWithMaxConnAndTimeout
NewServerWithTimeout
NewTLSServer
NewDefaultServer
TLS
MaxConns
Timeout
Protocol
Port
Addr
Go Proverbs, by Rob Pike
没有令人困惑的事(是 nil 还是空)
新来的人很容易上手
自文档
很容易维护和扩展
高度的可配置化
直觉式的编程
使用 Functional Options 构造 Server 对象
NewServer 函数
TLS 函数
MaxConns 函数
Timeout 函数
Protocol 函数
Option 函数类型
使用 Builder 构造 Server 对象
ServerBuilder 类
NewServer 函数
Server 对象
Config 对象
不同的创建函数
Server 对象
参考文档
优点
Functional Options
Builder 模式
配置对象方案
配置选项问题
Go 编程模式:Functional Options

该思维导图由 AI 生成,仅供参考

你好,我是陈皓,网名左耳朵耗子。
这节课,我们来讨论一下 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的使用方法和优势,对于Go语言开发者具有实际指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《左耳听风》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • 汪辉
    之前看到mq的初始化可选配置的时候有用到Functional Options这个模式,没想到在这里找到源头了。
    2021-01-19
    8
  • Geek_a754be
    之前在公司自研的微服务框架里面看到大规模使用,原来有个学名叫Functional Options
    2021-02-09
    1
    7
  • 太强了,受益匪浅
    2021-02-18
    3
  • Geek_sevn
    如沐春风
    2023-07-30归属地:广东
  • 辰星
    太强了
    2022-12-04归属地:广东
  • 拉欧
    option 意味选项,本身就有函数的意思
    2022-04-14
  • Geek_Huahui
    真的牛逼
    2022-03-14
  • 今年也没有猫
    简单理解 就是一种闭包的组织形式。
    2022-02-04
  • 方勇(gopher)
    确实很多中间件的传参都这么设计,有时候可能要考虑,函数放在client端,还是server端
    2021-12-17
  • 青阳
    和函数科里化是一回事吗
    2021-11-12
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部