Reputation: 10522
Is it possible to bind a previously declared function to more than one struct? Ex:
package main
import "fmt"
// very useful function both A and B should have
func SayHi() {
fmt.Println("hi!")
}
type A struct {} // A needs SayHi :(
type B struct {} // B needs SayHi :(
func main() {
a := A{}
a.SayHi()
b := B{}
b.SayHi()
}
The main reason is that I don't want to repeat SayHi
implementation for each type that needs it, so this won't fulfill as an answer:
type A struct {}
func A SayHi() {
fmt.Println("hi!")
}
type B struct {}
func B SayHi() {
fmt.Println("hi!")
}
In other words, how to borrow|inherit|share|bind methods between structs?
PS: Not sure what terminology Go uses for that, but it seems interfaces doesn't apply to this case since it would require methods to be re implemented for each struct.
Upvotes: 0
Views: 87
Reputation: 43949
One way to do this is to declare the method as part of a third struct:
type Foo struct {}
func (f Foo) SayHi() {
fmt.Prinln("hi!")
}
This method can then be added to A
by embedding it:
type A struct {
Foo
}
A
will expose all the methods of Foo
, and since Foo
is an empty struct it doesn't affect its in-memory layout. Note that when the SayHi
method is called, it won't know whether it is being called on an A
or Foo
variable, so this is only really appropriate for self contained methods.
If the method body does need to know the type of the receiver, you will need to explicitly declare the method on A
. You could factor out the body into a helper function to share the implementation with other types.
Upvotes: 3