Игнорировать регистр в отражении Голанга FieldByName - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь прочитать из структуры, используя отражение в 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 Ответ

0 голосов
/ 10 января 2019

Используйте 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())
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...