Несколько «классов» с одинаковыми именами функций - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь извлечь некоторые данные из myanimelist и imdb, используя Go. Ожидается, что результаты поиска будут совершенно разными в зависимости от сайта, с которого собираются данные, для myanimelist и imdb необходима другая функция (с тем же именем). В настоящее время я пытаюсь суммировать свои функции в структуре и вызывать их через структуру. Однако это работает не так, как ожидалось.

type myAnimeList interface {
    search(url string, name string) (string, bool)
    getScore(url string, regex string) (string, bool)
    getTop(url string, regex string) (string, bool)
    getEpisodes(url string, regex string) (string, bool)
    getInfo(url string, regex string) (string, bool)
    getAired(url string, regex string) (string, bool)
}

В конечном итоге я планирую использовать словарь:

var SitesAvailable = map[string]interface{}{
    "myanimelist":  http.MyAnimeList,
    "myanimelist2": http.MyAnimeList,
}

Если бы я мог решить, какой метод поиска я хочу активировать, и вызвать его. Это может выглядеть примерно так:

SitesAvailable["myanimelist"].search(url, seriesName)

Я очень запутался в своем мышлении и не имею четкой структуры того, как я могу это сделать. Но мне нужен словарь, в котором я могу решить, какой метод поиска следует использовать, и каким-то образом отделить функции imdb от функций myanimelist. Там должно быть в том же пакете.

Любое руководство о том, как я могу выполнить sh это?

Обновление 1

Так что я последовал примеру @syazdani с общим интерфейсом и теперь у меня есть следующее. Кажется, он работает так, как я хотел, и немного улучшил структуру.

type Website interface {
    Search() (string, bool)
    GetScore()
    GetTop() (string, bool)
    GetInfo()
    GetAired()
}

type myAnimeList struct {
    score    string
    rank     string
    episodes string
    info     string
    aired    string
    genre    string
    response string
    url      string
}

func (d myAnimeList) GetSeasonal() (string, bool){
//...
}
func (d myAnimeList) GetTop() (string, bool) {
//...
}
/*(repeat with all functions named in the Website interface)*/

var SitesAvailable = map[string]Website{
    "myanimelist":  http.MyAnimeList,
    "myanimelist2": http.MyAnimeList,
}

Чтобы получить доступ к функциям, вызовите следующее:

SitesAvailable["myanimelist"].Search(url, name)

Поскольку поиск принимает два аргумента типа string это тоже нужно использовать.

1 Ответ

2 голосов
/ 13 февраля 2020

Вероятно, вам следует обратиться к шаблону Factory , чтобы решить эту проблему. Вы определяете интерфейс (как у вас с myAnimeList выше, но, вероятно, с более обобщенным c именем), но тогда вам также необходимо предоставить две отдельные реализации (одну для IMDB и другую для myAnimeList). Я надеюсь, что это поможет!

См. здесь , чтобы узнать, как реализовать интерфейсы в golang.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...