Игнорировать регистр в отражении Голанга FieldByName
Я пытаюсь прочитать из структуры, используя отражение в golang, что мне удалось сделать успешно, но мне интересно, что я могу сделать, чтобы игнорировать регистр имени поля.
У меня есть код ниже
type App struct{
AppID string
Owner string
DisplayName string
}
func Extract(app *App){
appData := reflect.ValueOf(app)
appid := reflect.Indirect(appData).FieldByName("appid")
fmt.Println(appid.String())
owner:=reflect.Indirect(appData).FieldByName("owner")
fmt.Println(owner.String())
}
Вышеуказанная функция возвращает <invalid-value>
для обоих и из-за нижнего регистра имени поля
Есть ли способ, которым я мог бы проигнорировать это дело?
1 ответ
Решение
Используйте Value.FieldByNameFunc и strings.ToLower, чтобы игнорировать регистр при поиске поля:
func caseInsenstiveFieldByName(v reflect.Value, name string) reflect.Value {
name = strings.ToLower(name)
return v.FieldByNameFunc(func(n string) bool { return strings.ToLower(n) == name })
}
Используйте это так:
func Extract(app *App) {
appData := reflect.ValueOf(app)
appid := caseInsenstiveFieldByName(reflect.Indirect(appData), "appid")
fmt.Println(appid.String())
owner := caseInsenstiveFieldByName(reflect.Indirect(appData), "owner")
fmt.Println(owner.String())
}