首页  >  文章  >  后端开发  >  如何在 Go 中重写嵌入的结构体方法?

如何在 Go 中重写嵌入的结构体方法?

Barbara Streisand
Barbara Streisand原创
2024-10-28 16:10:02790浏览

How to Override Embedded Struct Methods in Go?

在 Go 中重写嵌入式结构体的方法

在 Go 中,当一个结构体继承另一个结构体(称为嵌入)时,它会继承该嵌入结构体的所有字段和方法结构。但是,如果继承结构定义了自己的方法,其名称与嵌入结构中的方法同名,则嵌入方法将被隐藏,或者更确切地说,被隐藏。

重写嵌入方法

重写嵌入结构中的方法涉及使用以下语法显式访问嵌入结构的方法:

<code class="go">yourStruct.EmbeddedStruct.method()</code>

例如:

<code class="go">type Base struct {
    val int
}
func (b *Base)Set(i int) {
    b.val = i
}

type Sub struct {
    Base
    changed bool
}</code>

这里,Sub 嵌入了 Base。但是,Sub 的 Set 方法会覆盖 Base 的 Set 方法。要从 Sub 中调用 Base 的原始 Set 方法,需要显式调用 b.Base.Set(i)。

示例:重写和调用嵌入方法

考虑以下代码:

<code class="go">func t16() {
    s := &Sub{}
    s.Set(1)
    var b *Base = &s.Base
    fmt.Printf("%+v\n", b)
    fmt.Printf("%+v\n", s)
}</code>

最初,调用 Sub 的 Set 方法,该方法覆盖 Base 的 Set 方法。为了演示 Base 的 Set 方法的原始行为,可以调用 s.Base.Set(10):

<code class="go">func t16() {
    s := &Sub{}
    s.Base.Set(10)
    var b *Base = &s.Base
    fmt.Printf("%+v\n", b)
    fmt.Printf("%+v\n", s)
}</code>

这确保调用 Base 的原始 Set 方法,绕过 Sub 的自定义 Set 方法及其后续修改改变了。

以上是如何在 Go 中重写嵌入的结构体方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn