Вы можете использовать reflect.Type
для представления / описания типа Go.А во время выполнения вы можете использовать reflect.New()
, чтобы получить указатель на обнуленное значение этого типа, заключенное в reflect.Value
.И если вам нужен срез вместо одного значения, вы можете использовать reflect.SliceOf()
или получить дескриптор типа значения среза на первом месте.
Если вы храните refect.Type
значения ваших таблиц, вот как вы можете их использовать:
type Record struct {
TableName string
PrimaryKey string
XormStruct reflect.Type
}
var ListOfTables [...]Record {
{"User", "id", reflect.TypeOf((*User)(nil)).Elem()},
{"Post", "post_id", reflect.TypeOf((*Post)(nil)).Elem()},
}
// User is xorm struct
type User struct {
Id int64
Name string
}
// Post is xorm struct
type Post struct {
Post_id int64
Name string
Other string
}
Обратите внимание, что вы должны использовать экспортированные поля!
А затем обрабатывать таблицы:
for _, rec := range ListOfTables {
entries := reflect.New(reflect.SliceOf(t.XormStruct)).Interface()
err := xorm.Find(entries)
// Handle error
err := xml.Marshal(entries)
// Handle error
}
Вы можете увидеть рабочий пример (подтверждение концепции) этого (без xorm
, поскольку он недоступен на Go Playground), используя JSON: Go Playground .
Если вы былидля хранения reflect.Type
значений срезов в первую очередь:
var ListOfTables [...]Record {
{"User", "id", reflect.TypeOf([]User{})},
{"Post", "post_id", reflect.TypeOf([]Post{})},
}
И использовать его также проще:
for _, rec := range ListOfTables {
entries := reflect.New(t.XormStruct).Interface()
err := xorm.Find(entries)
// Handle error
err := xml.Marshal(entries)
// Handle error
}
См. подтверждение концепции этого: Go Playground.
Обратите внимание, что если Record
содержит типы срезов (в поле XormStruct
), если вам когда-либо понадобится доступ к типу структуры (типу элемента структуры), вы можетеиспользуйте для этого Type.Elem()
.