Я определил interface
с именем session
, и у меня есть SessionA
и SessionB
вот так
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)
}
В моей функции main
я хочу определить параметр, который может автоматически вызывать StartSession
func main() {
sessionType := 1 // maybe 2, just example
var s interface{}
if sessionType == 1 {
s = SessionA{}
} else {
s = SessionB{}
}
s.StartSession()
}
но я понимаю s.StartSession() type interface {} is interface with no methods
, мой вопрос в том, как я могу использовать одну и ту же переменную для вызова разных StartSession()
🤔 А знаете ли вы, что...
Go активно развивается и имеет регулярные релизы.
You can write a function that accept interface
package main
import "fmt"
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)
}
func main() {
sessionType := 1 // maybe 2, just example
sessionA:= &SessionA{
jobs: "job1",
}
sessionB := &SessionB{
foods: "food1",
}
if sessionType == 1 {
runSession(sessionA)
} else {
runSession(sessionB)
}
}
func runSession(s Session) {
s.StartSession()
}
Необходимо два исправления:
Вот код:
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
}
вы можете использовать шаблон стратегии, с помощью которого вы можете расширить свой код, если он вам понадобится. Объект, который вызывается во время выполнения, зависит от некоторого контекста.
type Session interface { //the common behaviour
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)
}
ваш основной может быть:
func main() {
sessionToExcecute := 1
sessions := map[int]Session{
1: &SessionA{jobs: "some job"},
2: &SessionB{foods: "a food"},
}
sessions[sessionToExcecute].StartSession()
}