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()
}