Я пытаюсь извлечь некоторые данные из 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 это тоже нужно использовать.