marcio
marcio

Reputation: 10522

Is it possible to bind a previously declared function to a struct?

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

Answers (1)

James Henstridge
James Henstridge

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

Related Questions