2015-08-10 3 views
-1

У меня есть функцияПолучить поля пустого ломтика STRUCT в Go

func (r *render) foo(v interface{}) { 
    val := reflect.ValueOf(v) 
    fields := structs.Fields(val.Index(0).Interface()) 

... 

Который берет кусочек и структуры пытается получить поля V, однако если v пусто, то «val.Index (0) "сбой программы. Есть лучший способ сделать это?

ответ

2

Вы должны проверить сначала, если у вас есть кусок, чтобы начать с, а затем проверить, если у вас есть пустой кусок, и вы, вероятно, следует проверить, что у вас есть на структуру тоже пока вы на него: (example)

val := reflect.ValueOf(v) 
if val.Kind() != reflect.Slice { 
    fmt.Println("not a slice") 
    return 
} 

if val.Len() == 0 { 
    fmt.Println("empty slice") 
    return 
} 

if val.Index(0).Kind() != reflect.Struct { 
    fmt.Println("not a slice of structs") 
    return 
} 

fields := structs.Fields(val.Index(0).Interface()) 
... 

Если вы хотите только поля из структуры типа, независимо от того, если срез пуст, вы можете использовать Elem метод типа Slice, чтобы извлечь его (example)

// get the internal type of the slice 
t := val.Type().Elem() 
if t.Kind() != reflect.Struct { 
    fmt.Println("not a struct") 
    return 
} 

fmt.Println("Type:", t) 
for i := 0; i < t.NumField(); i++ { 
    fmt.Println(t.Field(i).Name) 
} 
+0

Ну я знаю й На этом всегда будет кусочек, пустой или нет. Однако мне нужно иметь возможность получать поля типа элементов среза независимо. –

+1

@ tommy_p1ckles: Ваш вопрос был о сбое, когда срез пуст, поэтому вам нужно убедиться, что это не так. Что еще вы имеете в виду? – JimB

+0

Извините, я думаю, что это неправильно. Моя функция принимает кусочек структур и мне нужно иметь возможность получить имена всех полей структуры, это не проблема, когда структура непусто, как код «fields: = structs.Fields (val.Index (0) .Interface()) делает это, однако, если срез пуст, то этот подход не работает, поскольку нет первого элемента для просмотра. –

Смежные вопросы