利用Golang可选参数实现可选模式
创始人
2024-05-17 05:10:03
0

本文讨论Golang函数可选参数及函数类型,以及如何利用可选函数类型实现可选模式。同时通过构造函数作为示例,实现强大带可选参数的构造函数,让代码更直观、灵活、支持扩展。

从需求开始

可选参数给函数传递额外参数扩展或修改其行为,下面示例利用可选功能创建House类型:

h := NewHouse(WithConcrete(),WithoutFireplace(),
)

NewHouse是构造函数,WithConcreteWithoutFireplace是传入构造函数的可选参数,用于修改其返回值。下面会详细WithConcreteWithoutFireplace可选功能函数,有时它们比正常函数参数更有用。

定义构造函数

首先定义要利用可选功能的结构体:

type House struct {Material     stringHasFireplace boolFloors       int
}// `NewHouse` is a constructor function for `*House`
func NewHouse() *House {const (defaultFloors       = 2defaultHasFireplace = truedefaultMaterial     = "wood")h := &House{Material:     defaultMaterial,HasFireplace: defaultHasFireplace,Floors:       defaultFloors,}return h
}

House可能采用不同材料,有多层,并可能包括壁炉。NewHouse构造函数返回House指针,所有属性包括缺省值。正常情况下,首先构造House,然后根据不同需求修改属性值。使用函数可选参数,可以给构造函数传入一组修改器函数。

定义可选函数

首先定义函数类型,接受House类型指针:

type HouseOption func(*House)

这是可选函数的签名,下面定义一些可选函数用于修改*House实例:

func WithConcrete() HouseOption {return func(h *House) {h.Material = "concrete"}
}func WithoutFireplace() HouseOption {return func(h *House) {h.HasFireplace = false}
}

上面每个函数是可选构造函数,返回另一个函数,带*House参数,没有返回值。我们看到返回的函数修改了*House实例的属性。还可以实现其他可选函数类型用于修改参数实例属性,下面函数返回修改楼层的可选函数:

func WithFloors(floors int) HouseOption {return func(h *House) {h.Floors = floors}
}

增强构造函数

现在组合可选功能函数和构造函数:

// NewHouse now takes a slice of option as the rest arguments
func NewHouse(opts ...HouseOption) *House {const (defaultFloors       = 2defaultHasFireplace = truedefaultMaterial     = "wood")h := &House{Material:     defaultMaterial,HasFireplace: defaultHasFireplace,Floors:       defaultFloors,}// Loop through each optionfor _, opt := range opts {// Call the option giving the instantiated// *House as the argumentopt(h)}// return the modified house instancereturn h
}

构造函数接受一组任意数量可选功能函数作为参数,首次初始化House属性后,依此运行可选功能函数修改属性值。
回到开始的示例,现在可以实现带可选参数的构造函数调用:

h := NewHouse(WithConcrete(),WithoutFireplace(),WithFloors(3),
)

可选模式的优势

上面讨论了如何实现可选模式,这里总结下其优势。

直观清晰

相比于显示修改对象属性:

h := NewHouse()
h.Material = "concrete"

可利用构造函数直接实现:

h := NewHouse(WithConcrete())

采用这种方式更清晰,无需指定字符串值,避免打字错误并暴露*House内部细节。

支持扩展

可选模式支持扩展,总是支持不同可选函数参数传入构造函数。举例,既然房屋楼层可以为任何整数,我们提供具体数值作为参数传入构造函数:

h := NewHouse(WithFloors(4))

参数顺序

使用可选模式与参数顺序无关,相比于正常参数有很大的灵活性;而且,可以提供任意个可选参数,相比正常参数则必须提供所有参数。

// What `NewHouse` would look like if we used
// regular function arguments
// We would always need to provide all three
// arguments no matter what
h := NewHouse("concrete", 5, true)

相关内容

热门资讯

女子投诉来伊份粽子吃出带血创可... 转自:财联社【女子投诉来伊份粽子吃出带血创可贴 公司回应】财联社5月11日电,江苏一名消费者苏女士5...
上海警方通报:偷拍女乘客网约车... 【上海警方通报:#偷拍女乘客网约车司机被拘#】#警方通报司机偷拍女乘客已被行拘# 上海市公安局...
激进转型隐忧多,溜溜梅“你没事... (转自:浩海投研Pro)作者/星空下的番茄编辑/菠菜的星空排版/星空下的香菜“你没事儿吧?没事儿就吃...
吴桂英:以重大项目建设提质增效... 转自:长沙发布吴桂英主持召开专题调度会议以重大项目建设提质增效更好支撑长沙高质量发展5月11日,省委...
“哈尔滨银行杯”第22届新晚报... 随着“哈尔滨银行杯”第22届新晚报万人徒步大赛开赛日期临近,冰城市民的期待与热情已被全面点燃。5月1...
14名北大学生联合报案,“00... 近年来,“圈子”文化在年轻人中盛行,许多人因兴趣结识而成为好友,大家对于“同好”也总是会不自觉地多些...
“我只有一罐豆子” 加沙住院病... 转自:央视以色列从3月起全面禁止人道主义援助进入加沙地带,加沙民众的温饱和健康面临严重危机,甚至医院...
产量翻番!这种“明星水果”有望... 夏天快来了“日啖荔枝三百颗,不辞长作岭南人”的时节又到了价格大跳水!暴跌40%近日,潮新闻记者走访水...
“放下手机读会儿书”公益文化品...     5月10日,在浙江省湖州市德清县举办的世界品牌莫干山大会期间,由中共黑龙江省委宣传部、中共湖...
琼州海峡航线于5月10日23时... 转自:中国水运网5月10日晚,记者从湛江海事局获悉,受强风天气影响,自5月10日23时起琼州海峡客滚...
网约车司机偷拍和散布他人隐私被... 5月11日,上海市公安局闵行分局发布警情通报:一网约车司机因偷拍和散布他人隐私被行政拘留。经查,王某...
欧洲天然气市场走势展望 原标题:欧洲天然气市场形势中期展望文/朱岩岩马俊金羽翔,中海石油气电集团有限责任公司,国际石油经济2...
流动见证活力 发展续写繁荣——... 转自:中国水运网厦门港。刚刚过去的“五一”假期,全社会跨区域人员流动量超14.65亿人次,同比增长7...
重庆一高校花75万元买一个路由... 封面新闻记者 马嘉豪近日,有网友发消息称,重庆三峡学院在进行设备采购时,疑似存在违规行为。该校采购的...
科技赋能 向“新”发展——20... CFIC导读◆当前,新一轮科技革命和产业变革深入发展,正在改变品牌的发展模式和竞争格局。科技创新赋能...
“被我爸吓死!”夏天必备,千万... 来源:杭州发布 又到了蚊子每日光顾的时候,每年夏天因为蚊香、电蚊香液、杀虫喷雾等驱蚊产品使用不当产生...
晶泰控股(02228)拟2.5... 晶泰控股(02228)发布公告,于2025年5月10日,买方(本公司全资附属公司)、卖方、担保人及目...
王一博程耳二度合作人鱼 【#王一博程耳二度合作人鱼#】5月11日, 河南籍青年演员 @UNIQ-王一博 主演的电影《人·鱼》...
75万买299元路由器:采购漏... 转自:新京报评论若不打破这种“违规-叫停-再违规”的循环,公共资金的“漏水”将难以堵住。▲重庆三峡学...
网约车司机偷拍女乘客视频发上网... 5月11日,上海市公安局闵行分局官方微博发布警情通报:据媒体此前报道,5月9日,有一IP地址为上海的...