Reputation: 85
According to the code below:
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)
}
I have a struct A
, and 2 functions Func1
, Func2
in A
, function A.Func1
will call A.Func2
.
And I have another struct B
that embedding struct A
, and have a function Func2
that overriding A.Func2
.
When I declare b
that has value B{}
and call b.Func1(1)
, it will run A.Func1
and call A.Func2
but not run A.Func1
and call B.Func2
that I override A.Func2
in B
.
My question is how can I fix the code so that when I call b.Func1(1)
, it will run A.Func1
and call B.Func2
that I override A.Func2
in B
.
Upvotes: 2
Views: 5650
Reputation: 49231
Using interface you can get a little bit closer the functionality you want.
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)
}
Upvotes: 3
Reputation: 12685
You are calling promoted method a.Func2(i)
using b
receiver b.A.Func2(i)
type. So in actual it is calling the function with receiver A
. Since there is no method overriding in go. Only there are embedded types . So you have to create your version of the same function if you wants your function to be used. Like
func (a *B) Func(i int){
fmt.Println("Calling function from b receiver")
}
can call this in B
's Func2
func (b *B) Func2(i int) {
i += 1
b.Func(i)
}
Check this question for more details
Upvotes: 3