Вы должны проверить сначала, если у вас есть кусок, чтобы начать с, а затем проверить, если у вас есть пустой кусок, и вы, вероятно, следует проверить, что у вас есть на структуру тоже пока вы на него: (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)
}
Ну я знаю й На этом всегда будет кусочек, пустой или нет. Однако мне нужно иметь возможность получать поля типа элементов среза независимо. –
@ tommy_p1ckles: Ваш вопрос был о сбое, когда срез пуст, поэтому вам нужно убедиться, что это не так. Что еще вы имеете в виду? – JimB
Извините, я думаю, что это неправильно. Моя функция принимает кусочек структур и мне нужно иметь возможность получить имена всех полей структуры, это не проблема, когда структура непусто, как код «fields: = structs.Fields (val.Index (0) .Interface()) делает это, однако, если срез пуст, то этот подход не работает, поскольку нет первого элемента для просмотра. –