根据下面的代码:

type A struct {
}

func (a *A) Func1(i int) {
    a.Func2(i)
}

func (a *A) Func2(i int) {
    fmt.Println(i)
}

type B struct {
    *A
}

func (b *B) Func2(i int) {
    i += 1
    b.A.Func2(i)
}

func main() {
    var b = B{}
    b.Func1(1)
}

我有一个struct A,还有2个函数Func1Func2中的A,函数A.Func1将调用A.Func2

我还有另一个struct B嵌入struct A,还有一个功能Func2覆盖了A.Func2

当我声明具有b值的B{}并调用b.Func1(1)时,它将运行A.Func1并调用A.Func2,但不运行A.Func1并调用我在B.Func2中覆盖A.Func2B

我的问题是如何修复代码,以便当我调用b.Func1(1)时,它将运行A.Func1并调用在B.Func2中覆盖A.Func2B

最佳答案

您正在使用a.Func2(i)接收者b类型调用升级方法b.A.Func2(i)。因此,实际上它是使用接收者A调用该函数。由于没有方法可以覆盖。只有嵌入式类型。因此,如果要使用功能,则必须创建相同功能的版本。喜欢

func (a *B) Func(i int){
    fmt.Println("Calling function from b receiver")
}

可以在BFunc2中调用它
func (b *B) Func2(i int) {
    i += 1
    b.Func(i)
}

查看此question了解更多详细信息

关于pointers - Go中的方法重写,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48580935/

10-11 07:39