今天和一个同事一起review代码,看他又写用embedded struct抽公共代码,稍微吐槽了一下。唠唠叨叨,骂骂咧咧地bb了好久,反正他也没听进去。

刚开始写go那会儿,我也傻傻的照着网上的《用内嵌实现继承的方法》这类博客去写公共代码。但有句话叫go语言没有继承(Go has no inheritance.)也不是说go不需要继承,过载,面向对象,阿巴阿巴。就是现在的项目就是go写的,打工人写就完事儿了。但想想go就是tmd没有继承!

有些代码有点重复写就写了,这样好改啊(雅言叫可维护性强)

看这么个例子, 比与A和B都有Fixed,给抽它个公共struct。

type ProductA struct {
    Embedded
    Flexible int `json:"flexible"`
}
type ProductB struct {
    Embedded
    Flexible string `json:"flexible"`
}
type Embedded struct {
    Fixed int `json:"fixed" validate:"required,gte=10,lte=20`
}

// 随便写个方法
func (e Embedded) add() int {
    return e.Fixed + 1
}
Dog extends AnimalCat extends AnimalAnimal.eat()Dog.eat()super()it is as it ishe is as it isshe is as it istype Eater interfaceit ishe isshe is

尽量别整embedded struct搞继承 多为之后改代码的人考虑(官话叫可维护性强)

fixed
func (e Embedded) validate() error {
    // 校验代码
    // 通过return nil
    // ....
    // 校验失败
    return FieldError("fixed") //FieldError 返回用户错误提示信息
}
Embedded.Fixed
type Embedded struct {
    Fixed int `json:"fixed_value"`
}
func (e Embedded) validate() error {
    // 校验代码
    // 通过return nil
    // ....
    // 校验失败
    return FieldError("fixed") //FieldError 返回用户错误提示信息
}
fixedfixed_value
Embedded.Fixed
e := Embedded{}
e.Fixed ...