может иметь разный тип?
Есть таблица в базе cabinets, она хранит кабинеты клиентов, каждый кабинет имеет определённый type(например google/yandex) и credentials.
Поле credentials может быть таких форматов:
{"api_key": "..."}
{"api_key": "...", "stats_key": "..."}
{"api_key": "...", "client_id": "..."}
Формат зависит от поля type.
А вот как в Golang отразить такую структуру, да так, чтобы для других разработчиков было максимально понятно, удобно и по возможности, чтобы работало быстро.
type Credentials {
ApiKey string
StatsKey string
ClientId string
}
type Cabinet {
Type CabinetType
Credentials Credentials
}
У меня вот так сейчас, но очень хотелось бы сделать отдельную структуру под каждый тип, чтобы в коде было однозначно понятно, что для гугла есть только api_key, а для яндекса другой набор, но как в структуре Cabinet сделать поле Credentials разных типов структур...
Использование Credentials будет только там, где уже заранее известно какие они должны быть, например в GoogleProvider или YandexProdiver, для гугла известно что нужен только ApiKey, для Яндекса ApiKey и ClientId и т.п.
Возможно вообще лучше всего использовать interface{} и через методы GetGoogleCreds() GetYandexCreds() и приводить тип каждый раз?
можно сделать struct{*Yandex, *Google} и написать кастомный scan/unmarshal, который будет заполнять только нужное поле
Ни разу не спец, у меня Го - всего лишь хобби, но я в прошлом пет-проекте сделал похоже на второй вариант. Тебе вторая часть кредов нужна для генерации объекта некоторого. В твоём случае твои креды хранят апи_кей и объект интерфейса, который умеет генерировать этот объект. А кастомный анмаршал создаёт этот объект-генератор в зависимости от полей. Не очень хорошее решение, конфиг получает информацию о реализации(потому что умеет создавать объект), но работает.
Обсуждают сегодня