How can I implement different functions using the same interface in golang

Issue

I have defined an interface named session, and I have SessionA and SessionB like this

type Session interface {
    StartSession()
}
type SessionA struct {
    jobs string
}

type SessionB struct {
    foods string
}

func (sessionA *SessionA) StartSession() {
    fmt.Printf("begin to do %s\n", sessionA.jobs)
}

func (sessionB *SessionB) StartSession() {
    fmt.Printf("begin to eat %s\n", sessionB.foods)
}

In my main function I want to define a parameter which can call StartSession automatically

func main() {
    sessionType := 1 // maybe 2, just example
    var s interface{}
    if sessionType == 1 {
        s = SessionA{}
    } else {
        s = SessionB{}
    }
    
    s.StartSession() 
}

but I get this s.StartSession() type interface {} is interface with no methods, my question is how can I use same variable to call different StartSession()

Solution

Two fixes are needed:

  • To call an interface method on some variable, declare the variable as the interface type.
  • The pointer receiver implements the method. Assign pointers to the interface variable.

Here’s the code:

var s Session        // Declare variable as Session so we can call StarSession
if sessionType == 1 {
    s = &SessionA{}  // note & on this line
} else {
    s = &SessionB{}  // note & on this line
}

Answered By – user19129216

Answer Checked By – Katrina (GoLangFix Volunteer)

Leave a Reply

Your email address will not be published.