Извлеките имена FIELD структуры и поместите их в фрагмент строк.

Я хочу иметь возможность извлекать имена FIELD (а не значения) структуры в виде строк, помещать их в фрагмент строк, а затем использовать имена для печати в меню в Raylib (графическая библиотека для Go) в другом месте в программа. Таким образом, если я изменю поля в структуре, меню обновится автоматически, без необходимости возвращаться и редактировать его вручную. Итак, если вы посмотрите на структуру ниже, я хочу извлечь имена MOVING, SOLID, OUTLINE и т. Д., А не логическое значение. Есть ли способ сделать это?

type genatt struc {
    moving, solid, outline, gradient, rotating bool
}

person nicholasimon    schedule 19.05.2021    source источник


Ответы (1)


Для этого вы можете использовать отражение (пакет reflect). Получите дескриптор reflect.Type значения структуры и используйте Type.Field() для доступа к полям.

Например:

t := reflect.TypeOf(genatt{})

names := make([]string, t.NumField())
for i := range names {
    names[i] = t.Field(i).Name
}

fmt.Println(names)

Будет выведено (попробуйте на Go Playground):

[moving solid outline gradient rotating]

См. Связанные вопросы:

Как получить все Имена полей в golang proto генерируют сложные структуры

Как отсортировать поля структуры в алфавитном порядке

Какое использование тегов в Go?

person icza    schedule 19.05.2021
comment
Это сработало абсолютно идеально, и это именно то, что я хотел, спасибо. Если мне нужен список типов полей в виде строк, как бы я это сделал? Например, [int float32 string int], поэтому вместо имен в срезе это тип поля в виде строки в срезе? - person nicholasimon; 20.05.2021
comment
Если вы хотите добавить только string поля, проверьте тип типа: t.Field(i).Type.Kind() == reflect.String. - person icza; 21.05.2021