注:本文的灵感来源于GOPHER 2020年大会陈皓的分享,原PPT的链接可能并不方便获取,所以我下载了一份PDF到git仓,方便大家阅读。我将结合自己的实际项目经历,与大家一起细品这份文档。
目录
ServerConfig
我们先来看看一个常见的HTTP服务器的配置,它区分了2个必填参数与4个非必填参数
1 | type ServerCfg struct { |
SplitConfig
编程的一大重点,就是要 分离变化点和不变点
。这里,我们可以将必填项认为是不变点,而非必填则是变化点。
我们将非必填的选项拆分出来。
1 | type Config struct { |
到这里,其实已经满足大部分的开发需求了。那么,我们将进入今天的重点。
Functional Option
1 | type Server struct { |
耗子哥给出了6个点,但我感受最深的是以下两点:
- 可读性强,将配置都转化成了对应的函数项option
- 扩展性好,新增参数只需要增加一个对应的方法
那么对应的代价呢?就是需要编写多个Option函数,代码量会有所增加。
如果大家对这个感兴趣,可以去看一下Rob Pike的这篇blog 。
Further
顺着耗子叔的例子,我们再思考一下,如果配置的过程中有参数限制,那么我们该怎么办呢?
首先,我们改造一下函数Option
1 | // 返回错误 |
然后,我们改造一下其中两个函数作为示例
1 | func Protocol(p string) OptionWithError { |
我们再做一次改造
1 | func NewServer(addr string, port int, options ...OptionWithError) (*Server, error) { |
改造基本到此完成,希望能给大家带来一定的帮助。
Github: https://github.com/Junedayday/code_reading
Blog: http://junes.tech/
Bilibili:https://space.bilibili.com/293775192
公众号:golangcoding