Как я могу реализовать разные функции, используя один и тот же интерфейс в golang?

Я определил 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 активно развивается и имеет регулярные релизы.


47
3

Ответы:

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()
}