今年活下去就是最好的岁月静好
1. 前言
golang构造函数的初始化相信大家信手拈来,但是如果写出可扩展的,向后兼容且容易维护的构造函数,那是相当不容易的。那么这篇文章我将带领大家学习这项新的技能。
2. 不好的写法
type Student struct { Name string } func NewStudent(name string) *Student { return &Student{ Name: name, } }
可以看到当有一个属性name的时候构造函数挺简单的,但是后面需求变更了,要增加一个age属性,那么这个时候你就得修改Student结构体和构造函数,这样非常不利于扩展和维护,那么怎么解决呢?
3. 函数选项模式彻底搞定它
懂得人都懂,不懂的人会懂,接下来开始炫技了,请大家带上瓜子和板凳静听我娓娓道来。闲话不多说,直接上干货:
type Student struct { Name string Age int } //定义类型函数 type StudentOption func(*Student) //创建带有age的构造函数 func WithAge(age int) StudentOption{ return func(s *Student){ s.Age = age } } //创建带有默认值的构造函数 func NewStudent(name string, options ...StudentOption) *Student{ student := &Student{Name:name, Age:5} for _,o :=range options{ o(student) } return student }
看到了吗,我滴个乖乖,如此优雅的写法第一次见,那照这么说当我增加第三个属性sex的时候,那就再写一个WithSex就行了,不会改动之前已有的逻辑,这样当我实例化的时候NewStudent(“lisi”, WithAge(6),WithSex("男"))就行了,这样很方便不是吗,是的,我现在很明确告诉你非常方便。
4. 小结
Functional Options Pattern(简称FOP模式)这种函数选项模式既保持了兼容性,而且每增加1个新属性只需要1个With函数即可,大大减少了修改代码的风险,所以这种秀操作为什么还不在项目中实践呢?
5. 关注公众号
微信公众号:堆栈future