首页  >  文章  >  后端开发  >  如何在不影响基本结构的情况下重写 Go 中的嵌入结构方法?

如何在不影响基本结构的情况下重写 Go 中的嵌入结构方法?

Barbara Streisand
Barbara Streisand原创
2024-10-26 03:01:03269浏览

How to Override Embedded Struct Methods in Go Without Affecting the Base Struct?

重写 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

    // 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中文网其他相关文章!

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