Изменить значение структуры, заданную карту имен полей и значений - PullRequest
0 голосов
/ 09 мая 2018

Это моя структура:

type TableFields struct {
    Name   string
    Family string
    Age    int
}

sample := TableFields{
    Name:   "bill",
    Family: "yami",
    Age:    25,
}

Это очень простой пример, который я использую для описания своей проблемы.

Я хочу изменить значения в структуре sample, используя ключи и значения в map, которые я получаю. Каждый раз, когда я получаю map, ключи и значения будут отличаться. Как я могу использовать map для редактирования sample структуры?

Например:

updateTheseFieldsWithTheseVals := make(map[string]string)
updateTheseFieldsWithTheseVals["family"] = "yamie"
// this is my way
for key,val := range updateTheseFieldsWithTheseVals {
    // sample.Family=yamie works, but is not the answer I am looking for
    // sample.key = val  *This solution is not possible*
    oldValue := reflect.Indirect(reflect.ValueOf(get)).FieldByName(key).String()
    fmt.Println(oldValue) // result is yami

    oldValue = val
    fmt.Println(oldValue) //result is yamie
}
fmt.Println(updateTheseFieldsWithTheseVals)
// result :
// {bill yami 25}

Запускается, но не изменяет значения в sample.

1 Ответ

0 голосов
/ 09 мая 2018

Вот функция, которая обновляет строковые поля по имени:

func update(v interface{}, updates map[string]string) {
    rv := reflect.ValueOf(v).Elem()
    for key, val := range updates {
        fv := rv.FieldByName(key)
        fv.SetString(val)
    }
}

Используйте это так:

updates := map[string]string{"Family": "yamie"}
sample := TableFields{
    Name:   "bill",
    Family: "yami",
    Age:    25,
}
update(&sample, updates)

пример детской площадки

Несколько замечаний по поводу функции:

  • Функция update ожидает значение указателя, поэтому она может обновить исходное значение.
  • Функция будет паниковать, если поле не найдено или поле не является строковым типом. В зависимости от того, как используется функция, может быть полезно добавить проверки для fv.IsValid() и fv.Kind() == reflect.String.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...