在 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 // Both print the same value fmt.Printf("%+v\n", b) fmt.Printf("%+v\n", s) }</code>
这里,Sub 类型嵌入了 Base 类型。 Sub 和 Base 都有一个名为 Set 的方法,当你调用 s.Base.Set() 时,你就绕过了 Sub.Set() 方法,直接调用了 Base.Set() 方法。
To重写嵌入结构的方法,您可以调用 Sub.Set() 方法。在 Go 中,当类型实现与其嵌入类型同名的方法时,嵌入方法将被隐藏。
以下是代码的更新版本:
<code class="go">func (b *Sub) Set(i int) { b.Base.Set(i) // Call the Base.Set() method b.changed = true } func main() { s := &Sub{} s.Set(1) var b *Base = &s.Base // Note: b.val is now 1 // s.changed is now true fmt.Printf("%+v\n", b) fmt.Printf("%+v\n", s) }</code>
在此示例中,当调用 s.Set(1) 时,将调用 Sub.Set() 方法,该方法又调用 Base.Set() 方法。这会更新嵌入 Sub 中的 Base 结构体的 val 字段。更改的字段也将被设置为 true 以指示该值已被修改。
此解决方案允许您覆盖嵌入结构的方法而不影响基本结构。它是 Go 中用来实现代码可重用性和灵活性的常用技术。
以上是如何在不影响基本结构的情况下重写 Go 中的嵌入结构方法?的详细内容。更多信息请关注PHP中文网其他相关文章!