Struct embeding - 内联结构体

golang 中没有继承,但是其结构体内联的方式和继承很像,掌握内联结构体,面向对象都不怕!

Story + Code

昭君是一个很棒的结构体,他有一个field(字段)叫length(长度),很显然昭君对自己的length非常满意,所以他还有method专门炫耀自己的长度- Showoff()

type ZhaoJun struct{
    length int
}

func NewZhaoJun(length int)ZhaoJun{
    return ZhaoJun{
        length:length,
    }
}

func (zj ZhaoJun) ShowOff(){
    fmt.Printf("ZhaoJun's length is %d\n",zj.length)
}

func main() {
    zj := NewZhaoJun(18)
    zj.ShowOff()
}

运行结果为:昭君的length 为 18 !嗯,还是不错的:

ZhaoJun's length is 18

突然有一天,出现了一个更大的昭君,它是一个以昭君为内联的结构体,吸取了昭君的精华,具有昭君的所有field 和 method

type BiggerZhaoJun struct {
    ZhaoJun
}

func NewBiggerZhaoJun(length int) BiggerZhaoJun{
    bzj := BiggerZhaoJun{}
    bzj.length = length*2 // 长度翻倍
    return bzj
}

func main() {
    bzj := NewBiggerZhaoJun(18)
    bzj.ShowOff() // 更大的昭君可以调用昭君的method
}

运行结果为:昭君的length已经变为了36!原来在NewBiggerZhaoJun 中,对length进行了翻倍

ZhaoJun's length is 36

更大的昭君不满足于仅仅炫耀他的length,于是重写了他的 Showoff()

func (bzj BiggerZhaoJun) ShowOff(){
    fmt.Printf("ZhaoJun's length is %d,And can use for a long time!\n",bzj.length)
}

再次运行,现在的Showoff() 覆盖了 原来的Showoff(), 更大的昭君不仅length很长,而且还很持久!

ZhaoJun's length is 36,And can use for a long time!

总结一下:

结构体会“继承”内联结构体的字段和方法,如果如果同名,则会覆盖

Trick:

在实际编程中,我们会经常用到 锁 sync.Mutex,一般的写法是这样:

type M struct {
    mutex *sync.Mutex
    someFiled string
}

func (m *M) process(){
    fmt.Println("Helle World!")
}

func main() {
    m := M{}
    m.mutex = &sync.Mutex{}
    m.mutex.Lock()
    m.process()
    m.mutex.Unlock()
}

通过内联我们可以简写为:

type M struct {
    sync.Mutex
    someFiled string
}

func (m *M) process(){
    fmt.Println("Helle World!")
}

func main() {
    m := M{}
    m.Lock()
    m.process()
    m.Unlock()
}