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)