根据下面的代码:
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个函数Func1
,Func2
中的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.Func2
的B
。我的问题是如何修复代码,以便当我调用
b.Func1(1)
时,它将运行A.Func1
并调用在B.Func2
中覆盖A.Func2
的B
。 最佳答案
您正在使用a.Func2(i)
接收者b
类型调用升级方法b.A.Func2(i)
。因此,实际上它是使用接收者A
调用该函数。由于没有方法可以覆盖。只有嵌入式类型。因此,如果要使用功能,则必须创建相同功能的版本。喜欢
func (a *B) Func(i int){
fmt.Println("Calling function from b receiver")
}
可以在
B
的Func2
中调用它func (b *B) Func2(i int) {
i += 1
b.Func(i)
}
查看此question了解更多详细信息
关于pointers - Go中的方法重写,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48580935/