带参构造器的问题

通常情况下,创建一个新的对象会使用默认构造器。

假设现在我们要准备一个家庭医药包,里面有抵抗新冠的一些常用药,比如莲花清瘟,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相关推荐

  1. 给,你要的Go学习路线图来啦

    我是一只可爱的土拨鼠,专注于分享 Go 职场.招聘和求职,解 Gopher 之忧!欢迎关注我. 欢迎大家加入Go招聘交流群,来这里找志同道合的小伙伴!跟土拨鼠们一起交流学习. 先上图 Go开发者路线图 ...

  2. 禁止input密码自动填充及浏览器记住密码完整解决方案

    完整方案 禁止缓存,禁止自动填充,不会触发浏览提示记住密码,其余与正常一致,该方案跨浏览器兼容且易结合任何框架及库使用. npm i nice-pass-word 具体使用参照文档既可以. 下面的内容 ...

  3. Jq-滚动条插件写法(二)

    接着上次的未完的部分. 接下是对滚轮的支持. 滚轮大概可以分为这么两类: 1. Firefox Firefox 需要添加 'DOMMouseScroll' 事件支持,并取值是 使用detail 为正负 ...

  4. Saiku ui-settings接口404错误避免(二十九)

    Saiku ui-settings接口404错误避免 自己手动编译的saiku ,不知道为什么前端总是报错   /saiku/rest/saiku/info/ui-settings  404NotFo ...

  5. 给,你要的 Go 学习路线图来啦

    我是一只可爱的土拨鼠,专注于分享 Go 职场.招聘和求职,解 Gopher 之忧!欢迎关注我. 欢迎大家加入Go招聘交流群,来这里找志同道合的小伙伴!跟土拨鼠们一起交流学习. 先上图 Go开发者路线图 ...

  6. dwz 日期空间onchange事件

    dwz 日期空间onchange事件 在选择时间后,不仅要给当前时间控件的input的输入框赋值,同时还要给另外的一个页面的隐藏域input赋值 解决思路: 在时间控件的input选择赋值后,触发该i ...

  7. Golang 单例模式 singleton pattern

    在Java中,单例模式的实现主要依靠类中的静态字段.在Go语言中,没有静态类成员,所以我们使用的包访问机制和函数来提供类似的功能.来看下下面的例子: package singletonimport ( ...

  8. Go语言(golang)开源项目大全

    http://www.open-open.com/lib/view/open1396063913278.html#Compression 内容目录 Astronomy 构建工具 缓存 云计算 命令行选 ...

  9. golang 开源项目全集

    一直更新中,地址:https://github.com/golang/go/wiki/Projects#zeromq Indexes and search engines These sites pr ...

最新文章

  1. 小程序用thinkPHP上传文件到腾讯云对象存储空间
  2. 在VM虚拟机Windows Server r2上部署安装Microsoft Dynamics CRM 2016 步骤详解(一)
  3. 从零开始写javaweb框架 pdf_大学写的一个 Java Web 框架
  4. C语言试题九十一之写一个程序,用公式π/4=1-1/3+1/5-1/7+...,求π的近似值,直到最后一项的绝对值小于10^-8为止。
  5. 【洛谷P3410】拍照题解(最大权闭合子图总结)
  6. swiper高度自适应_微信小程序之swiper轮播图片高度自适应
  7. 九大操作系统掌门人齐聚岳麓,六代技术人跨代对话,共同见证技术大时代
  8. 11.25晚C语言答疑
  9. hp 计算机如何显示在桌面上,HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载...
  10. 大型软件工作站计算机性能配置要求,推荐配置7.3万元的高性能服务器计算机工作站(全文)...
  11. QT开发--Visual Studio2013--配置代码32bit、64bit环境
  12. php swoole 教程,PHP7安装Swoole详细教程
  13. vmware workstation14永久激活密钥
  14. Glyphicon 字体图标
  15. 信息系统研究中的设计科学研究7指南
  16. 机房运维6大隐患,你中了几个?
  17. 【转载】TCP/IP 之 大明王朝邮差
  18. 【数据结构初阶】八大排序算法+时空复杂度
  19. Android-网络编程:快乐词典
  20. 基于vue+element实现多级菜单动态生成

热门文章

  1. uniapp 项目中添加百度统计
  2. 轮毂要怎么选?选大还是选小?
  3. 学术期刊《广西物理》简介及投稿要求
  4. Golang语言快速上手到综合实战(Go语言、Beego框架、高并发聊天室、豆瓣电影爬虫) 下载
  5. DiscoveryClient
  6. linux ubuntu 下禁用/启用touchpad
  7. 侧信道攻击:SPA / DPA
  8. JavaWeb - Servlet实现文件下载漂亮小姐姐视频(文末有小姐姐视频Gif图哦)
  9. 关于Nvidia卡在注册界面的问题
  10. 台式计算机键盘驱动,新扬天电脑所配USB键盘功能键驱动问题注意事项