Привет Я пытаюсь сделать что-то вроде следующего примера.Вызов struct from map of structs
Мой опыт работы с PHP-разработчиком (я знаю!) Затрудняет мне это. Я читал Законы размышлений и другие источники, но это над моей головой. Подход, который я использую, вероятно, ошибочен ... и надеюсь, что кто-то может указать мне в правильном направлении.
Использование этого в конкретном виде заключается в том, что версия 01 или 02 или 03 отправляется из внешнего параметра, на основании этого мне нужно получить соответствующую структуру и заполнить ее значениями базы данных.
package V01
type Struct1 struct{
Field1 string
Field2 string
}
type Struct2 struct{
Field1 string
Field2 string
}
package V02
type Struct1 struct{
Field1 string
Field2 string
ExtraField1 string
}
type Struct2 struct{
Field1 string
Field2 string
ExtraField2 string
ExtraField3 string
}
var VStructs = map[string]map[string]interface{}{
"01": map[string]interface{}{
"Struct1": V01.Struct1{},
"Struct2": V01.Struct2{},
},
"02": map[string]interface{}{
"Struct1": V02.Struct1{},
"Struct2": V02.Struct2{},
},
"03" : map[string]interface{}{
"Struct1": V01.Struct1{},
"Struct2": V02.Struct2{},
},
}
// I get the struct fieldnames and so on.
fmt.Printf("%+v\n", VStructs["01"]["Struct1"])
// I cannot access any of the fields though because it is an interface
fmt.Println(VStructs["01"]["Struct1"].Field1) // PANIC!
// Type Switching is not working either since the version can be variable.
s := VStructs["01"]["Struct1"].Field1
switch x := s.(type) {
case reflect.Struct: // PANIC! reflect.Struct (type reflect.Kind) is not a type
fmt.Println("I am an struct")
default:
fmt.Println("I am an no struct")
}
Так что, может быть, может показать мне подходящий способ сделать это. Или, может быть, функция-обертка, чтобы вернуть правильную структуру ... нет подсказки на этом этапе.
Надеюсь, что это ясно, и будет уточняться, если вас попросят.
Вы должны использовать имена типов в тип переключателя, а не 'значения reflect.Kind'. То есть это должен быть 'case V01.Struct:' и т. д., а не 'case reflect.Struct:'. –
@ Ainar-G, спасибо, но версии V01, V02, V03 являются переменными, поэтому это не вариант, особенно если в каждой версии около 50 структур. – DonSeba
Затем вам нужно определить интерфейс для всех этих структур для реализации. –