golang Opts Pattern
带参构造器的问题
通常情况下,创建一个新的对象会使用默认构造器。
假设现在我们要准备一个家庭医药包,里面有抵抗新冠的一些常用药,比如莲花清瘟,999感冒灵颗粒,藿香正气片 etc.
package mainimport "fmt"// MedicalKit contains medicine that helps alleviate symptoms of COVID-19 virus
type MedicalKit struct {// 莲花清瘟LianHuaQingWenCapsule int// 999GanMaoLingKeLi int// 藿香正气片LophanthusAntiFebrileTablet int
}// NewMedicalKit create a new default medical kit
func NewMedicalKit() *MedicalKit{return &MedicalKit{LianHuaQingWenCapsule: 1,GanMaoLingKeLi: 1,LophanthusAntiFebrileTablet: 1,}
}func main() {kit:=NewMedicalKit()fmt.Println(kit)
}
那现在如果要创建的同时,修改对象的状态,怎么办?
你会很容易想到带参构造器:
// NewMedicalKit create a new default medical kit
func NewMedicalKit(LianHuaQingWenCapsule int,LophanthusAntiFebrileTablet int,GanMaoLingKeLi int,) *MedicalKit{return &MedicalKit{LianHuaQingWenCapsule: LianHuaQingWenCapsule,GanMaoLingKeLi: GanMaoLingKeLi,LophanthusAntiFebrileTablet: LophanthusAntiFebrileTablet,}
}
但是这样有一个问题,如果我只想传入其中一个参数,保持其他为默认值,在调用的时候,我不得不将参数全部传入。
kit:=NewMedicalKit(1,2,3)
另外一个问题是我需要记住参数传入的顺序,否则就会有差错。
那有没有一种方法,让我可以实现不需要关心参数传入顺序且不用传入非必要参数呢?答案是Opts模式
Opts模式
Opts模式相比默认构造器有如下优势
- 封装内部对象如何更改状态自身
- 只需要向构造器传入想修改的参数,默认的不需要传
- 不需要去关心向构造器传入的参数的顺序
package mainimport "fmt"// MedicalKit contains medicine that helps alleviate symptoms of COVID-19 virus
type MedicalKit struct {// 莲花清瘟LianHuaQingWenCapsule int// 999GanMaoLingKeLi int// 藿香正气片LophanthusAntiFebrileTablet int
}var (DefaultLianHuaQingWenCapsuleCount =1DefaultGanMaoLingKeLiCount=1DefaultLophanthusAntiFebrileTabletCount=1
)
// MedicalKitOptions 可以更改构造器行为
type MedicalKitOptions func(*MedicalKit)func NewMedicalKit(opts ...MedicalKitOptions) *MedicalKit{kit:=&MedicalKit{LophanthusAntiFebrileTablet: DefaultLophanthusAntiFebrileTabletCount,GanMaoLingKeLi: DefaultGanMaoLingKeLiCount,LianHuaQingWenCapsule: DefaultLianHuaQingWenCapsuleCount,}// 执行每个option函数for _, opt :=range opts{opt(kit)}return kit
}func main() {with999:= func(count int) MedicalKitOptions{return func(k *MedicalKit){k.GanMaoLingKeLi=count}}withLianHua:= func(count int) MedicalKitOptions{return func(k *MedicalKit) {k.LianHuaQingWenCapsule=count}}// without need to pass all argumentskit:=NewMedicalKit(with999(2),withLianHua(3))fmt.Println(kit)}
golang Opts Pattern相关推荐
- 给,你要的Go学习路线图来啦
我是一只可爱的土拨鼠,专注于分享 Go 职场.招聘和求职,解 Gopher 之忧!欢迎关注我. 欢迎大家加入Go招聘交流群,来这里找志同道合的小伙伴!跟土拨鼠们一起交流学习. 先上图 Go开发者路线图 ...
- 禁止input密码自动填充及浏览器记住密码完整解决方案
完整方案 禁止缓存,禁止自动填充,不会触发浏览提示记住密码,其余与正常一致,该方案跨浏览器兼容且易结合任何框架及库使用. npm i nice-pass-word 具体使用参照文档既可以. 下面的内容 ...
- Jq-滚动条插件写法(二)
接着上次的未完的部分. 接下是对滚轮的支持. 滚轮大概可以分为这么两类: 1. Firefox Firefox 需要添加 'DOMMouseScroll' 事件支持,并取值是 使用detail 为正负 ...
- Saiku ui-settings接口404错误避免(二十九)
Saiku ui-settings接口404错误避免 自己手动编译的saiku ,不知道为什么前端总是报错 /saiku/rest/saiku/info/ui-settings 404NotFo ...
- 给,你要的 Go 学习路线图来啦
我是一只可爱的土拨鼠,专注于分享 Go 职场.招聘和求职,解 Gopher 之忧!欢迎关注我. 欢迎大家加入Go招聘交流群,来这里找志同道合的小伙伴!跟土拨鼠们一起交流学习. 先上图 Go开发者路线图 ...
- dwz 日期空间onchange事件
dwz 日期空间onchange事件 在选择时间后,不仅要给当前时间控件的input的输入框赋值,同时还要给另外的一个页面的隐藏域input赋值 解决思路: 在时间控件的input选择赋值后,触发该i ...
- Golang 单例模式 singleton pattern
在Java中,单例模式的实现主要依靠类中的静态字段.在Go语言中,没有静态类成员,所以我们使用的包访问机制和函数来提供类似的功能.来看下下面的例子: package singletonimport ( ...
- Go语言(golang)开源项目大全
http://www.open-open.com/lib/view/open1396063913278.html#Compression 内容目录 Astronomy 构建工具 缓存 云计算 命令行选 ...
- golang 开源项目全集
一直更新中,地址:https://github.com/golang/go/wiki/Projects#zeromq Indexes and search engines These sites pr ...
最新文章
- 小程序用thinkPHP上传文件到腾讯云对象存储空间
- 在VM虚拟机Windows Server r2上部署安装Microsoft Dynamics CRM 2016 步骤详解(一)
- 从零开始写javaweb框架 pdf_大学写的一个 Java Web 框架
- C语言试题九十一之写一个程序,用公式π/4=1-1/3+1/5-1/7+...,求π的近似值,直到最后一项的绝对值小于10^-8为止。
- 【洛谷P3410】拍照题解(最大权闭合子图总结)
- swiper高度自适应_微信小程序之swiper轮播图片高度自适应
- 九大操作系统掌门人齐聚岳麓,六代技术人跨代对话,共同见证技术大时代
- 11.25晚C语言答疑
- hp 计算机如何显示在桌面上,HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载...
- 大型软件工作站计算机性能配置要求,推荐配置7.3万元的高性能服务器计算机工作站(全文)...
- QT开发--Visual Studio2013--配置代码32bit、64bit环境
- php swoole 教程,PHP7安装Swoole详细教程
- vmware workstation14永久激活密钥
- Glyphicon 字体图标
- 信息系统研究中的设计科学研究7指南
- 机房运维6大隐患,你中了几个?
- 【转载】TCP/IP 之 大明王朝邮差
- 【数据结构初阶】八大排序算法+时空复杂度
- Android-网络编程:快乐词典
- 基于vue+element实现多级菜单动态生成