根据以下代码:
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)
}
我有一个结构A
,Func1
中有2个函数Func2
,A
,函数A.Func1
会调用A.Func2
。
我有另一个嵌入struct B
的结构A
,并且有一个覆盖Func2
的函数A.Func2
。
当我声明值b
的{{1}}并致电B{}
时,它会运行b.Func1(1)
并致电A.Func1
但不会运行A.Func2
并致电A.Func1
,我在B.Func2
覆盖A.Func2
。
我的问题是如何修复代码,以便在我致电B
时,它会运行b.Func1(1)
并致电A.Func1
,我会覆盖B.Func2
A.Func2
}}
答案 0 :(得分:2)
您正在使用a.Func2(i)
接收方b
类型调用提升方法b.A.Func2(i)
。所以实际上它是用接收器A
调用函数。因为go中没有方法覆盖。只有嵌入式类型。因此,如果您希望使用您的功能,则必须创建相同功能的版本。像
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了解详情
答案 1 :(得分:2)
使用界面,您可以更加接近您想要的功能。
type F2 interface {
Func2(i int)
}
func Func1(f2 F2, i int) {
f2.Func2(i)
}
type A struct {
}
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 a = &A{}
Func1(a,1)
var b = &B{}
Func1(b,1)
}