我最近遇到了一个正在执行我不理解的代码。
有多个结构具有相同的嵌入式结构和一个接口,该接口定义了返回指向每个结构的指针的方法。此接口由嵌入式结构实现,但仅“部分”由单个结构实现,因此,每个结构仅实现返回指向该结构的指针的方法。
为了更好地理解,以下是代表性代码:
type BarStocks interface {
GetVodka() *Vodka
GetMartini() *Martini
GetBourbon() *Bourbon
GetNegroni() *Negroni
GetManhattan() *Manhattan
}
type BaseAttributes struct {
ID uuid.UUID
Quantity float64
CreatedAt time.Time
UpdatedAt time.Time
}
func (e *BaseAttributes) GetVodka() *Vodka {
return nil
}
func (e *BaseAttributes) GetMartini() *Martini {
return nil
}
func (e *BaseAttributes) GetBourbon() *Bourbon {
return nil
}
func (e *BaseAttributes) GetNegroni() *Negroni {
return nil
}
func (e *BaseAttributes) GetManhattan() *Manhattan {
return nil
}
然后,每个单独的结构仅实现返回其指针的方法,例如:
type Vodka struct {
BaseAttributes
Label string
}
func (v *Vodka) GetVodka() *Vodka {
return v
}
现在在代码中,此设置用于将单个结构作为指针类型转换到接口,如下所示:
func someFunc() BarStocks {
v := Vodka{}
return &v
}
现在我对Go语言还不是很深入,因此无法理解指向该结构的指针如何成为与接口相同的类型。
预先感谢您对此的任何见解。
我会尽力回答我认为您正在提出的问题。
有关嵌入的文档说明了您所看到的行为,
嵌入与子类化有一个重要的区别。当我们嵌入一个类型时,该类型的方法成为外部类型的方法,但是当它们被调用时,该方法的接收者是内部类型,而不是外部类型。
这说明了Vodka
嵌入BaseAttributes
实现所有方法的结构的结构如何BarStocks
能够满足接口Barstocks
。本文节选,然而,这并不说明我们如何有效地覆盖GetVodka()
我们的Vodka
结构。
为了理解这一点,我们需要阅读文档中的另一个摘录。
嵌入类型引入了名称冲突的问题,但是解决它们的规则很简单。首先,字段或方法X将其他任何项X隐藏在该类型的更深层嵌套的部分中。
此摘录说明,如果Vodka
实现GetVodka()
并嵌入一个struct(BaseAttributes)
也实现)GetVodka()
,则最外面的定义是优先的定义。
这些行为的组合说明了如何Vodka
满足BarStocks
界面并具有您在示例代码中看到的行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句