GoLang的类型转换到由结构体和嵌入式结构体实现的接口的工作方式

嗡嗡声:

我最近遇到了一个正在执行我不理解的代码。

有多个结构具有相同的嵌入式结构和一个接口,该接口定义了返回指向每个结构的指针的方法。此接口由嵌入式结构实现,但仅“部分”由单个结构实现,因此,每个结构仅实现返回指向该结构的指针的方法。

为了更好地理解,以下是代表性代码:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章