重写 Go 中的嵌入结构体方法
在 Go 中嵌入结构体时,嵌入结构体的方法将作为结构体的顶级成员使用嵌入结构。这允许轻松访问嵌入结构的功能。但是,如果嵌入结构体实现了自己的同名方法,则嵌入结构体的方法将被隐藏。
考虑以下示例:
<code class="go">package main import "fmt" type Base struct { val int } func (b *Base)Set(i int) { b.val = i } type Sub struct { Base changed bool } func (b *Sub)Set(i int) { b.val = i b.changed = true } func main() { s := &Sub{} s.Base.Set(1) var b *Base = &s.Base fmt.Printf("%+v\n", b) fmt.Printf("%+v\n", s) }</code>
在此示例中,Sub 结构体嵌入 Base 结构。 Base 结构体有一个 Set 方法,该方法被 Sub 结构体自己的 Set 方法隐藏。当调用 s.Base.Set(1) 时,调用的是 Base 结构体的 Set 方法,而不是 Sub 结构体的 Set 方法。
要覆盖嵌入结构体中嵌入结构体的方法,只需调用嵌入结构体即可嵌入结构体方法中的结构体方法。例如,以下代码将覆盖 Sub 结构中 Base 结构的 Set 方法:
<code class="go">func (b *Sub)Set(i int) { b.Base.Set(i) b.changed = true }</code>
通过此更改,当调用 s.Set(1) 时,将调用 Sub 结构的 Set 方法,它将调用 Base 结构体的 Set 方法,并将更改的字段设置为 true。这允许您覆盖嵌入结构的方法的行为,同时仍然可以访问嵌入结构的功能。
以上是如何在 Go 中重写嵌入结构的方法?的详细内容。更多信息请关注PHP中文网其他相关文章!