Здесь находится игровая площадка https://play.golang.org/p/qMKxqrOcc2. Проблема аналогична проблеме, которая находится на игровой площадке.Как определить динамическую структуру типа в golang?
Скажем, у меня есть условие, и нужно сделать это:
if modelName == "a"{
model = models.A
}
else{
model = models.B
}
где A
и B
некоторые модели:
type A struct{
filed1 string
field2 string
//etc
}
и модель B
является
type B struct{
filed1 string
field2 string
//etc
}
Поля в A
и B
га s одни и те же поля, но в основном они отражают таблицу базы данных (документ), и они имеют один и тот же тип (тип struct).
Когда я говорю, перед всем, что:
var model interface{}
я получил ошибку:
type models.A is not an expression
Я делаю это, чтобы избежать дублирования кода в коде, если вы спрашиваете, почему.
Вопрос похож на это: How to return dynamic type struct in Golang?
Вот обновление для кода:
b := c.mainHelper.GetModelBy("id", id, modelName).(map[string]interface{})
mapstructure.Decode(b, &model)
if modelName == "a"{
model.Photos = []string{"ph1","ph2"}
}
if modelName == "b"{
model.Docs = []string{"doc1","doc2"}
}
c.mainHelper.UpdateModel(product, id, modelName)
Я знаю, что это глупо, и, вероятно, это невозможно сделать, но есть и способ сделать это:
var model models.modelName --> somehow to concat modelName to this models?
ЗДЕСЬ NEW UPDATE
У меня есть две модели почты и продукта. У обоих из них есть поле «Фотографии».
type Post struct{
Photos []string
//etc
}
type Product {
Photos []string
//
}
Теперь я нужна одна функция, которая будет сказать:
func() RemovePhotos(id string, modelName string){
//if modelName=="post"
//get model post with id
//if modelName=="product"
//get model product with id
//set model.Photos = []string
//update model in db
}
Я могу понять, что я не могу назначить тип, но, как использовать эту одну функцию, чтобы удалить данные из типов различно? Насколько я могу видеть, избыточный код будет выглядеть следующим образом:
func() RemovePhotos(id string, modelName string) return bool{
if modelName == "post"{
var model models.Post
modelWithdata := getModelWithId.(*model)
modelWithdata.Photos = []string
//update model in db here
}
if modelName == "product"{
var model models.Product
modelWithdata := getModelWithId.(*model)
modelWithdata.Photos = []string
//update model in db here
}
//it does not matter what I return this is just redundancy example
return true
}
Как вы можете только разница в том, вар модель models.Post/var model models.Product
. Это избыточность в коде, и это выглядит уродливым, но если нет никакого способа обойти это, тогда хорошо, у меня будет этот законченный с избыточностью.
Как «модель» будет использоваться после назначения? Лучшее решение будет зависеть от этого. –
«Я делаю это, чтобы избежать избыточности кода». Не делай этого слишком рано! Не избегайте избыточности, пока не увидите, что действительно избыточно и может быть учтено в (непустом) интерфейсе. Тогда вы избегаете избыточности. – Volker
Я не могу принять никакого ответа, так как они не дают достаточного количества ответов. Я попробовал все это от ответов, прежде чем задал мне вопрос. – pregmatch