Структуры цикла и проверка вложенности для поиска совпадающего значения

#go #struct #interface

#Вперед #структура #интерфейс

Вопрос:

У меня есть структура перехода следующим образом:

 type AuditStruct struct {
 UsesResponsiveImages struct {
        ID               string
        Details          struct {
            Type     string
        }
 }
 UsesWebpImages struct {
        ID               string
        Details          struct {
            Type     string
        }
 }
 FontDisplay struct {
        ID               string
        // NO Details
 }
 .. etc etc
}
  

Я хочу перебрать каждую подструктуру аудита и проверить, есть ли ее детали.Тип равен «бла».

Предполагаемый результат — вернуть данные с соответствующими деталями.введите результат. В настоящее время использую reflect, но не могу с этим справиться.

 v := reflect.ValueOf(audits)

values := make([]interface{}, v.NumField())

 for i := 0; i < v.NumField(); i   {
   vDetails := v.Field(i).FieldByName("Details")
   // Cannot get type from vDetails.

   // Tried using values and interface but unsure how to access "type" sub value from values[i]
   values[i] = v.Field(i).Interface()
 }
  

Ответ №1:

Вы почти на месте. Детализируйте поле Типы, используя FieldByName:

 for i := 0; i < v.NumField(); i   {
    vDetails := v.Field(i).FieldByName("Details")
    if !vDetails.IsValid() {
        continue
    }
    vType := vDetails.FieldByName("Type")
    if !vType.IsValid() {
        continue
    }
    values[i] = vType.Interface()
}
  

Запустите его на игровой площадке.