今年活下去就是最好的岁月静好
- 前言
golang构造函数的初始化相信大家信手拈来,但是如果写出可扩展的,向后兼容且容易维护的构造函数,那是相当不容易的。那么这篇文章我将带领大家学习这项新的技能。
- 不好的写法
type Student struct {
Name string
}
func NewStudent(name string) *Student {
return &Student{
Name: name,
}
}
可以看到当有一个属性name的时候构造函数挺简单的,但是后面需求变更了,要增加一个age属性,那么这个时候你就得修改Student结构体和构造函数,这样非常不利于扩展和维护, 那么怎么解决呢?
- 函数选项模式彻底搞定它
懂得人都懂,不懂的人会懂,接下来开始炫技了,请大家带上瓜子和板凳静听我娓娓道来。闲话不多说,直接上干货:
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("男"))
就行了,这样很方便不是吗,是的,我现在很明确告诉你非常方便。
- 小结
Functional Options Pattern
(简称FOP模式)这种函数选项模式既保持了兼容性,而且每增加1个新属性只需要1个With函数即可,大大减少了修改代码的风险,所以这种秀操作为什么还不在项目中实践呢?
- 关注公众号
微信公众号:堆栈future