Дана структура вида
type MyStruct struct {
text string
x int
}
Через ORM GORM эта структура хранится в таблице БД.
Где-то через ORM эти данные считываются из БД. Например:
func main(){
var mystruct MyStruct
DB.First(&mystruct)
println(mystruct.text)
println(mystruct.x)
}
Далее я хочу сделать "плагин" к приложению, который добавит к структуре новое поле 'y' и функцию, которая считает из БД это поле, т.е.:
func plugin(){
var mystruct MyStruct
DB.First(&mystruct)
println(mystruct.text)
println(mystruct.x)
//Считываем новое поле
println(mystruct.y)
}
Вопрос в том, как добавить новое поле к структуре? Через рефлексию можно добавить, но на выходе будет новый тип и в принципе это может быть и устроило, ведь ORM с одной табицы БД может прочитать данные в разные типы. Но как обновить изначальную таблицу БД, через прямые запросы из "плагина"? Как обращаться к этому новому типу из других модулей/плагинов, через interface{} (any) и потерять статическую проверку типов?
Для пользователя должно работать так:
Пользователь запускает ПО, на экране у него форма с полями. Заходит в меню плагинов и подключает нужный. На форме и в БД появляется новое поле. Т.е. никакого доступа к исходным кодам и компиляции из исходников.
Может есть примеры как это делается на других типизированных языках: C, Java, Kotlin, C# ?