今年活下去就是最好的岁月静好

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

5. 关注公众号