今年活下去就是最好的岁月静好
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
}
NewStudent(“lisi”, WithAge(6),WithSex("男"))
4. 小结
Functional Options Pattern