вызов модели динамически на ходу

Рассмотрим такие продукты, как джинсы, рубашки, шорты, и я хочу хранить заказы в соответствующих таблицах продуктов, например, заказ, связанный с джинсами, должен храниться в таблицах джинсов и так далее. Каждая таблица будет иметь одинаковые параметры. Таким образом, при хранении заказов в таблице я должен иметь возможность вызывать соответствующую структуру и сохранять заказ. Я исхожу из фона Laravel (PHP), где я могу загружать динамическую модель, например

$model = "Dynamic passed model names"

$class = "App\\Models\\$model";

но как мы можем это сделать в Go, если вызвать динамическую структуру

e.g,

в модели ABC.go

type ABC struct{
  Name string
  Invetory int
}

в модели XYZ.go

type XYZ struct {
  Name string
  Invetory int
}

Таким образом, ввод может быть ABC или XYZ, и я должен загрузить структуру соответственно.

загрузить структуру ABC

inpt := "ABC"

product := models.<inpt>{
  Name: "prodct name"
  Inventory: 10
}

В приведенном выше фрагменте имя модели является динамическим. Как это сделать в Go?


person Amit Sharma    schedule 16.11.2019    source источник
comment
У меня буквально никогда не было точки, когда мне приходилось загружать структуру динамически. Из-за необходимости - каков здесь вариант использования.   -  person Markus W Mahlberg    schedule 16.11.2019
comment
Если ваши таблицы продуктов идентичны, то они, вероятно, должны быть одной таблицей со столбцом product.   -  person Flimzy    schedule 16.11.2019
comment
@MarkusWMahlberg, для уменьшения нагрузки на таблицы. По сути, мы распределяем данные по разным (соответствующим) таблицам.   -  person Amit Sharma    schedule 16.11.2019


Ответы (1)


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

Вы можете сделать что-то вроде:

type Inventory interface{
 // Your interface defining methods here
}

var toUse Inventory

switch input {
case "ABC":
   toUse = ABC{}
case "XY":
   toUse = XY{}
}

Вопрос в том, почему у вас есть два типа, которые (не считая опечатки) абсолютно идентичны.

person Markus W Mahlberg    schedule 16.11.2019
comment
Может быть n моделей, я не могу добавлять кейсы для каждой модели. - person Amit Sharma; 16.11.2019
comment
@AmitSharma Опять же - ваша архитектура кажется ущербной. Мне буквально никогда не приходилось динамически загружать модель данных примерно за 30 лет программирования, не говоря уже о произвольном количестве. «Я не могу» больше похоже на «Я не хочу», tbh. Насколько я понимаю, ваш вопрос больше похож на «Является ли Go заменой Laravell, но с добавлением всего лишь нескольких интересных функций?» Ответ отрицательный. - person Markus W Mahlberg; 16.11.2019
comment
У меня здесь есть несколько сценариев, в настоящее время я работаю над платформой обмена криптовалютой, где пользователи могут торговать на нашей платформе с различными парами, такими как BTC_USDT, BTC_BNB, BTC_LTC и т. Д. Итак, чтобы уменьшить нагрузку на базу данных, как мы думали, мы должны хранить торговые ордера в соответствующей таблице криптопар. Подобно ордерам, связанным с BTC_USDT, в tbl_btc_usdt и так далее. Я не хочу создавать отдельные API для каждой пары, вместо этого я использую одну конечную точку API и динамически вызываю структуру таблицы. - person Amit Sharma; 16.11.2019
comment
@AmitSharma Как насчет того, чтобы сделать валюту чертовски ценной? type Exchange struct { type ExchangeType, currency Currency, amount float} где ExchangeType может быть пут или колл, валюта - это iota „enum“ а у вас закончится единая модель данных для всех валют? - person Markus W Mahlberg; 16.11.2019
comment
@AmitSharma: То, что вы описываете, - это не N моделей, это ровно 1 модель с N экземплярами. - person Flimzy; 16.11.2019
comment
@Flimzy Чтобы снизить нагрузку на таблицы, в основном мы распределяем данные по соответствующим таблицам. Вот почему мы используем архитектуру N моделей. - person Amit Sharma; 16.11.2019
comment
@AmitSharma, у этих N таблиц одинаковая структура? т.е. все ли они имеют одинаковые столбцы? Если да, то почему эти N таблиц не могут быть представлены одной структурой Go? Как наличие N идентичных типов структур, объявленных в Go, снижает нагрузку на базу данных? - person mkopriva; 16.11.2019
comment
@AmitSharma: Нет, у вас все еще есть только одна модель. Вы просто распределите его по нескольким таблицам. - person Flimzy; 16.11.2019
comment
@AmitSharma А у таблиц нет нагрузки. СУБД имеет. На самом деле, используя больше таблиц, которые содержат метаданные и прочее, вы увеличиваете нагрузку на свою СУБД (по крайней мере, в отношении оперативной памяти, если даже не в отношении ввода-вывода и процессора). Как сказал Флимзи, у вас есть одна модель с разными экземплярами. - person Markus W Mahlberg; 16.11.2019
comment
чтобы разделить нагрузку на множество таблиц, используйте одну модель с параметром TableName. С вашим orm или чем-то еще, убедитесь, что вы запускаете sql-запросы для параметра TableName. Когда вы создаете экземпляр модели, вы определяете TableName динамически. - person mh-cbon; 17.11.2019
comment
@ mh-cbon Похоже, способ сделать это. Но все же вопрос в том, зачем это нужно? Это добавляет уровень сложности, чтобы предотвратить использование того, что явно является полем. - person Markus W Mahlberg; 17.11.2019
comment
@MarkusWMahlberg говорит, что ваш механизм dbms не обрабатывает блокировку строк, поэтому вы можете разделить стоимость блокировок таблиц. Я не имел в виду, что это хорошая идея, только чтобы предоставить средство для ее реализации в простом решении. - person mh-cbon; 17.11.2019
comment
@ mh-cbon Понятно. По-прежнему похоже на знаменитую преждевременную оптимизацию, которая, как мы все знаем со времен Дональда Кнута, является корнем всех зол. - person Markus W Mahlberg; 17.11.2019
comment
@mkopriva, да, у меня одна модель, но многоэкземплярная или таблицы. Итак, в соответствии с вводными данными я хочу вставить в соответствующую таблицу, которая является моим требованием. - person Amit Sharma; 18.11.2019