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!
叼茂SEO.bfbikes.com
叼茂SEO.bfbikes.com
叼茂SEO.bfbikes.com
看的我热血沸腾啊
怎么收藏这篇文章?
不错不错,我喜欢看 https://www.237fa.com/
想想你的文章写的特别好https://www.ea55.com/
看的我热血沸腾啊https://www.ea55.com/
想想你的文章写的特别好https://www.ea55.com/
想想你的文章写的特别好www.jiwenlaw.com
兄弟写的非常好 https://www.cscnn.com/
畅玩私服传奇网,超级体验引领全新热潮:https://501h.com/yuanshi/2024-07-27/23643.html
你的文章让我心情愉悦,真是太棒了! http://www.55baobei.com/G73qS08San.html
你的文章充满了智慧,让人敬佩。 http://www.55baobei.com/4usAjb1EuU.html
你的文章让我心情愉悦,真是太棒了! http://www.55baobei.com/G73qS08San.html
《你好,星期六》大陆综艺高清在线免费观看:https://www.jgz518.com/xingkong/142636.html
你的文章让我感受到了快乐,每天都要来看一看。 http://www.55baobei.com/xKFXrBN7Og.html
你的文章充满了智慧,让人敬佩。 http://www.55baobei.com/4usAjb1EuU.html
每次看到你的文章,我都觉得时间过得好快。 https://www.4006400989.com/qyvideo/17490.html
你的文章内容非常精彩,让人回味无穷。 http://www.55baobei.com/d1GEwFI2PK.html
《出租车司机2017》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/22556.html
《大明按察使》国产剧高清在线免费观看:https://www.jgz518.com/xingkong/30320.html
iyinho.com
你的文章充满了欢乐,让人忍不住一笑。 https://www.yonboz.com/video/53012.html
《出租车司机2017》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/22556.html
你的文章充满了创意,真是让人惊喜。 https://www.4006400989.com/qyvideo/61695.html
你的文章让我感受到了不一样的风景,谢谢分享。 http://www.55baobei.com/V6T8tqWz9C.html
《水后》记录片高清在线免费观看:https://www.jgz518.com/xingkong/49621.html
你的文章让我学到了很多知识,非常感谢。 http://www.55baobei.com/0XBiVgiPmQ.html
你的文章让我感受到了不一样的风景,谢谢分享。 https://www.yonboz.com/video/71949.html
《咒怨2 录像带版》科幻片高清在线免费观看:https://www.jgz518.com/xingkong/121081.html
《大项目》喜剧片高清在线免费观看:https://www.jgz518.com/xingkong/129403.html
你的文章充满了创意,真是让人惊喜。 https://www.yonboz.com/video/97103.html
《水后》记录片高清在线免费观看:https://www.jgz518.com/xingkong/49621.html
《俏皮女学生》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/57322.html
《寻找多莉帕顿》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/71795.html
你的文章让我感受到了正能量,非常棒! https://www.yonboz.com/video/48131.html
你的文章充满了创意,真是让人惊喜。 https://www.4006400989.com/qyvideo/55629.html
你的文章让我感受到了不一样的风景,谢谢分享。 http://www.55baobei.com/lH86xOnuz9.html
《水后》记录片高清在线免费观看:https://www.jgz518.com/xingkong/49621.html
《大楚第一纨绔》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/15650.html
哈哈哈,写的太好了https://www.lawjida.com/
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新车上路,只带前10个人coinsrore.com
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
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳东方明珠客服电话是多少?(▲18288362750?《?微信STS5099? 】
如何联系华纳东方明珠客服?(▲18288362750?《?微信STS5099? 】
华纳东方明珠官方客服联系方式?(▲18288362750?《?微信STS5099?
华纳东方明珠客服热线?(▲18288362750?《?微信STS5099?
华纳东方明珠24小时客服电话?(▲18288362750?《?微信STS5099? 】
华纳东方明珠官方客服在线咨询?(▲18288362750?《?微信STS5099?
华纳东方明珠客服电话是多少?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
华纳东方明珠开户专线联系方式?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
华纳东方明珠客服电话是多少?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
华纳东方明珠开户专线联系方式?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
新盛客服电话是多少?(?183-8890-9465—《?薇-STS5099】【
新盛开户专线联系方式?(?183-8890--9465—《?薇-STS5099】【?扣6011643??】
新盛客服开户电话全攻略,让娱乐更顺畅!(?183-8890--9465—《?薇-STS5099】客服开户流程,华纳新盛客服开户流程图(?183-8890--9465—《?薇-STS5099】
果博东方客服开户联系方式【182-8836-2750—】?薇- cxs20250806】
果博东方公司客服电话联系方式【182-8836-2750—】?薇- cxs20250806】
果博东方开户流程【182-8836-2750—】?薇- cxs20250806】
果博东方客服怎么联系【182-8836-2750—】?薇- cxs20250806】
东方明珠客服开户联系方式【182-8836-2750—】?μ- cxs20250806
东方明珠客服电话联系方式【182-8836-2750—】?- cxs20250806】
东方明珠开户流程【182-8836-2750—】?薇- cxs20250806】
东方明珠客服怎么联系【182-8836-2750—】?薇- cxs20250806】
东方明珠客服开户联系方式【182-8836-2750—】?μ- cxs20250806
东方明珠客服电话联系方式【182-8836-2750—】?- cxs20250806】
东方明珠开户流程【182-8836-2750—】?薇- cxs20250806】
东方明珠客服怎么联系【182-8836-2750—】?薇- cxs20250806】
华纳圣淘沙开户步骤详解(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】
华纳圣淘沙开户步骤详解(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】
华纳圣淘沙公司开户新手教程
零基础学会(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)
寻找华纳圣淘沙公司开户代理(183-8890-9465薇-STS5099】
华纳圣淘沙官方合作开户渠道(183-8890-9465薇-STS5099】
华纳圣淘沙公司开户代理服务(183-8890-9465薇-STS5099】
华纳圣淘沙公司开户咨询热线(183-8890-9465薇-STS5099】
联系客服了解华纳圣淘沙开户
(183-8890-9465薇-STS5099】
华纳圣淘沙公司开户专属顾问
(183-8890-9465薇-STS5099】