go中的option设计模式实践

先来看个例子:

package main

import "fmt"

type cache struct {
    Name string `json:"mysqli"`
    Host string `json:"host:127.0.0.1"`
    Port int64  `json:"port:3306"`
    Note string
    pwd  string //私有
}

func main() {
    dbConf := cache{Name: "conn", Host: "127.0.0.1", Port: 3306, pwd: "123456"}
    fmt.Println(dbConf)
}

以上是最基础的构造cache方法,注意,cache中包含了pwd这样一个私有化属性,此时在其他的包构造该结构体时,是无法直接赋值的,那怎么办呢?首先想到的是用一个公共的方法来进行统一赋值,如下:

package main

import "fmt"

type cache struct {
    Name string `json:"mysqli"`
    Host string `json:"host:127.0.0.1"`
    Port int64  `json:"port:3306"`
    Note string
    pwd  string //私有
}

func SetCacheVale(name, host, note, pwd string, port int64) *cache {
    return &cache{
        Name: name,
        Host: host,
        Note: note,
        pwd:  pwd,
        Port: port,
    }
}

func main() {
    //dbConf := cache{Name: "conn", Host: "127.0.0.1", Port: 3306, pwd: "123456"}
    //fmt.Println(dbConf)
    dbConf := SetCacheVale("link1", "127.0.0.1", "", "123456", 3306)
    fmt.Println(dbConf)
}

以上通过SetCacheVale 进行结构体的属性赋值,这样做貌似没什么问题,但是如果后期需要对cache结构体扩充,则必然需要修改SetCacheVale这个方法的传参,而外部如果调用了该方法则必须跟着修改。那怎么办呢?把每个参数分别加一个set方法是否可行呢?接着再改一下

package main

import "fmt"

type cache struct {
    Name string `json:"mysqli"`
    Host string `json:"host:127.0.0.1"`
    Port int64  `json:"port:3306"`
    Note string
    pwd  string //私有
}


//设置必填属性
func setBaseVale(name, host string) *cache {
    return &cache{Name: name, Host: host}
}

//设置必填属性+非必填note
func setCacheWithNote(name, host, note string) *cache {
    return &cache{Name: name, Host: host, Note: note}
}

//设置必填属性+非必填port
func setCacheWithPort(name, host string, port int64) *cache {
    return &cache{Name: name, Host: host, Port: port}
}

func main() {
    //dbConf := cache{Name: "conn", Host: "127.0.0.1", Port: 3306, pwd: "123456"}
    //fmt.Println(dbConf)
    //dbConf := SetCacheVale("link1", "127.0.0.1", "", "123456", 3306)
    //fmt.Println(dbConf)
    dbConf := setCacheWithNote("link2", "127.0.0.1", "这是测试连接")
    fmt.Println(dbConf)
}

上面代码中,加入了3个方法,分别是设置基本属性,设置port,设置note。可对应不同的场景,缺点很明显,如果cache加入一个新的属性,则会add多种排列组合,虽然业务端不用修改代码,但是这样的实现不太优雅。下面就来进行重构。

package main

import "fmt"

type cache struct {
    Name string `json:"mysqli"`
    Host string `json:"host:127.0.0.1"`
    Port int64  `json:"port:3306"`
    Note string
    pwd  string //私有
}

//定义一个模版接口,需要实现call调用,传参为cache的结构体指针
type optInterface interface {
    call(*cache)
}

//抽出cache中的name,定义结构体
type SetName struct {
    name string
}

//name实现了接口,用来设置name
func (s SetName) call(c *cache) {
    c.Name = s.name
}

//SetName实现了optInterface中的方法,所以withName的类型和optInterface的类型相同
func withName(n string) optInterface {
    return SetName{name: n}
}

type SetHost struct {
    host string
}

func (s SetHost) call(c *cache) {
    c.Host = s.host
}

func withHost(h string) optInterface {
    return SetHost{host: h}
}

//定义一个公共函数入口,用来接收结构体,调用结构体的call方法
func ValOption(opts ...optInterface) *cache {
    o := &cache{}
    for _, opt := range opts {
        opt.call(o)
    }
    return o
}

func main() {
    dbConf := ValOption(withName("连接测试2"), withHost("127.0.0.2"))
    fmt.Println(dbConf)
}

上面的代码中,将cache的属性抽离,每个属性分别对应3个模块:

  • 1.Set{field} 该模块是个结构体,对应cache字段
  • 2.Set{field}.call(),该结构体方法接收者是上面对应的结构体,该方法实现了接口optInterface
  • 3.with{field} ,该模块返回一个具体设置好的结构体。

除此之外,还需要一个公共的解析方法去解析具体结构体设置方法,在上述代码中,该方法名称为ValOption ,它接收类型为optInterface的组成的切片,返回一个cache指针。


关键说完之后,我们来分析一下重点:
1.为何要设计一个接口?并且还需要属性实现该方法?
原因是公共方法ValOption需要一个统一的参数类型,该接口的目的就是为了类型转换。假设不定义接口,每个参数的类型都不一样,则无法实现公共方法统一处理。


2.option设计模式的具体原则是什么?

  • 1.对于cache中的每一个属性都定义一个属性struct,一个属性设置方法(返回结构体本身)和属性接口方法(接口方法传入cache结构体,内部实现结构体属性复写)
  • 2.用一个公共入口函数去执行属性的接口方法(传入结构体)

3.option设计模式的好处是什么?
这种方式我们使用Option接口,该接口保存一个未导出的方法,在未导出的options结构上记录选项,这种模式为client端提供了更多的灵活性,针对每一个option可以做更细的custom function设计,更加清晰且不暴露cache的结构,也提高了单元测试的覆盖性,缺点是当cache结构发生变化时,也要同时维护option的结构,维护复杂性升高了。

end!

已有 58 条评论

  1. 叼茂SEO.bfbikes.com

  2. 叼茂SEO.bfbikes.com

  3. 叼茂SEO.bfbikes.com

  4. 看的我热血沸腾啊

  5. 怎么收藏这篇文章?

  6. 不错不错,我喜欢看 https://www.237fa.com/

  7. 想想你的文章写的特别好https://www.ea55.com/

  8. 看的我热血沸腾啊https://www.ea55.com/

  9. 想想你的文章写的特别好https://www.ea55.com/

  10. 想想你的文章写的特别好www.jiwenlaw.com

  11. 兄弟写的非常好 https://www.cscnn.com/

  12. 畅玩私服传奇网,超级体验引领全新热潮:https://501h.com/yuanshi/2024-07-27/23643.html

  13. 你的文章让我心情愉悦,真是太棒了! http://www.55baobei.com/G73qS08San.html

  14. 你的文章充满了智慧,让人敬佩。 http://www.55baobei.com/4usAjb1EuU.html

  15. 你的文章让我心情愉悦,真是太棒了! http://www.55baobei.com/G73qS08San.html

  16. 《你好,星期六》大陆综艺高清在线免费观看:https://www.jgz518.com/xingkong/142636.html

  17. 你的文章让我感受到了快乐,每天都要来看一看。 http://www.55baobei.com/xKFXrBN7Og.html

  18. 你的文章充满了智慧,让人敬佩。 http://www.55baobei.com/4usAjb1EuU.html

  19. 每次看到你的文章,我都觉得时间过得好快。 https://www.4006400989.com/qyvideo/17490.html

  20. 你的文章内容非常精彩,让人回味无穷。 http://www.55baobei.com/d1GEwFI2PK.html

  21. 《出租车司机2017》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/22556.html

  22. 《大明按察使》国产剧高清在线免费观看:https://www.jgz518.com/xingkong/30320.html

  23. iyinho.com

  24. 你的文章充满了欢乐,让人忍不住一笑。 https://www.yonboz.com/video/53012.html

  25. 《出租车司机2017》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/22556.html

  26. 你的文章充满了创意,真是让人惊喜。 https://www.4006400989.com/qyvideo/61695.html

  27. 你的文章让我感受到了不一样的风景,谢谢分享。 http://www.55baobei.com/V6T8tqWz9C.html

  28. 《水后》记录片高清在线免费观看:https://www.jgz518.com/xingkong/49621.html

  29. 你的文章让我学到了很多知识,非常感谢。 http://www.55baobei.com/0XBiVgiPmQ.html

  30. 你的文章让我感受到了不一样的风景,谢谢分享。 https://www.yonboz.com/video/71949.html

  31. 《咒怨2 录像带版》科幻片高清在线免费观看:https://www.jgz518.com/xingkong/121081.html

  32. 《大项目》喜剧片高清在线免费观看:https://www.jgz518.com/xingkong/129403.html

  33. 你的文章充满了创意,真是让人惊喜。 https://www.yonboz.com/video/97103.html

  34. 《水后》记录片高清在线免费观看:https://www.jgz518.com/xingkong/49621.html

  35. 《俏皮女学生》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/57322.html

  36. 《寻找多莉帕顿》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/71795.html

  37. 你的文章让我感受到了正能量,非常棒! https://www.yonboz.com/video/48131.html

  38. 你的文章充满了创意,真是让人惊喜。 https://www.4006400989.com/qyvideo/55629.html

  39. 你的文章让我感受到了不一样的风景,谢谢分享。 http://www.55baobei.com/lH86xOnuz9.html

  40. 《水后》记录片高清在线免费观看:https://www.jgz518.com/xingkong/49621.html

  41. 《大楚第一纨绔》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/15650.html

  42. 哈哈哈,写的太好了https://www.lawjida.com/

  43. 新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com

  44. 新车上路,只带前10个人coinsrore.com

  45. 2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
    新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
    新车首发,新的一年,只带想赚米的人coinsrore.com
    新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
    做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
    新车上路,只带前10个人coinsrore.com
    新盘首开 新盘首开 征召客户!!!coinsrore.com
    新项目准备上线,寻找志同道合的合作伙伴coinsrore.com
    新车即将上线 真正的项目,期待你的参与coinsrore.com
    新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
    新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com

  46. 华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099

  47. 华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099

  48. 华纳东方明珠客服电话是多少?(▲18288362750?《?微信STS5099? 】
    如何联系华纳东方明珠客服?(▲18288362750?《?微信STS5099? 】
    华纳东方明珠官方客服联系方式?(▲18288362750?《?微信STS5099?
    华纳东方明珠客服热线?(▲18288362750?《?微信STS5099?
    华纳东方明珠24小时客服电话?(▲18288362750?《?微信STS5099? 】
    华纳东方明珠官方客服在线咨询?(▲18288362750?《?微信STS5099?

  49. 华纳东方明珠客服电话是多少?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
    华纳东方明珠开户专线联系方式?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】

  50. 华纳东方明珠客服电话是多少?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
    华纳东方明珠开户专线联系方式?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】

  51. 新盛客服电话是多少?(?183-8890-9465—《?薇-STS5099】【
    新盛开户专线联系方式?(?183-8890--9465—《?薇-STS5099】【?扣6011643??】
    新盛客服开户电话全攻略,让娱乐更顺畅!(?183-8890--9465—《?薇-STS5099】客服开户流程,华纳新盛客服开户流程图(?183-8890--9465—《?薇-STS5099】

  52. 果博东方客服开户联系方式【182-8836-2750—】?薇- cxs20250806】
    果博东方公司客服电话联系方式【182-8836-2750—】?薇- cxs20250806】
    果博东方开户流程【182-8836-2750—】?薇- cxs20250806】
    果博东方客服怎么联系【182-8836-2750—】?薇- cxs20250806】

  53. 东方明珠客服开户联系方式【182-8836-2750—】?μ- cxs20250806
    东方明珠客服电话联系方式【182-8836-2750—】?- cxs20250806】
    东方明珠开户流程【182-8836-2750—】?薇- cxs20250806】
    东方明珠客服怎么联系【182-8836-2750—】?薇- cxs20250806】

  54. 东方明珠客服开户联系方式【182-8836-2750—】?μ- cxs20250806
    东方明珠客服电话联系方式【182-8836-2750—】?- cxs20250806】
    东方明珠开户流程【182-8836-2750—】?薇- cxs20250806】
    东方明珠客服怎么联系【182-8836-2750—】?薇- cxs20250806】

  55. 华纳圣淘沙开户步骤详解(183-8890-9465—?薇-STS5099【6011643】

    华纳圣淘沙公司开户流程全解析(183-8890-9465—?薇-STS5099【6011643】
    华纳圣淘沙公司账户注册指南(183-8890-9465—?薇-STS5099【6011643】
    新手如何开通华纳圣淘沙公司账户(183-8890-9465—?薇-STS5099【6011643】
    华纳圣淘沙企业开户标准流程(183-8890-9465—?薇-STS5099【6011643】
    华纳圣淘沙公司开户:从零到一(183-8890-9465—?薇-STS5099【6011643】
    官方指南:华纳圣淘沙公司开户流程(183-8890-9465—?薇-STS5099【6011643】
    华纳圣淘沙公司开户流程说明书(183-8890-9465—?薇-STS5099【6011643】

  56. 华纳圣淘沙开户步骤详解(183-8890-9465—?薇-STS5099【6011643】

    华纳圣淘沙公司开户流程全解析(183-8890-9465—?薇-STS5099【6011643】
    华纳圣淘沙公司账户注册指南(183-8890-9465—?薇-STS5099【6011643】
    新手如何开通华纳圣淘沙公司账户(183-8890-9465—?薇-STS5099【6011643】
    华纳圣淘沙企业开户标准流程(183-8890-9465—?薇-STS5099【6011643】
    华纳圣淘沙公司开户:从零到一(183-8890-9465—?薇-STS5099【6011643】
    官方指南:华纳圣淘沙公司开户流程(183-8890-9465—?薇-STS5099【6011643】
    华纳圣淘沙公司开户流程说明书(183-8890-9465—?薇-STS5099【6011643】

  57. 华纳圣淘沙公司开户新手教程

    零基础学会(183-8890-9465薇-STS5099)
    华纳圣淘沙公司开户

    华纳圣淘沙公司开户保姆级教程(183-8890-9465薇-STS5099)

    一步步教你开通华纳圣淘沙公司账户(183-8890-9465薇-STS5099)

    华纳圣淘沙公司开户分步图解

    首次开户必看:(183-8890-9465薇-STS5099)
    华纳圣淘沙全攻略

    华纳圣淘沙公司开户实操手册(183-8890-9465薇-STS5099)
    华纳圣淘沙开户流程视频教程

    手把手教学:(183-8890-9465薇-STS5099)
    华纳圣淘沙公司开户

    华纳圣淘沙公司开户完全指南(183-8890-9465薇-STS5099)

  58. 寻找华纳圣淘沙公司开户代理(183-8890-9465薇-STS5099】

    华纳圣淘沙官方合作开户渠道(183-8890-9465薇-STS5099】

    华纳圣淘沙公司开户代理服务(183-8890-9465薇-STS5099】

    华纳圣淘沙公司开户咨询热线(183-8890-9465薇-STS5099】

    联系客服了解华纳圣淘沙开户

    (183-8890-9465薇-STS5099】
    华纳圣淘沙公司开户专属顾问

    (183-8890-9465薇-STS5099】

添加新评论