У меня есть структура Person.
type Person struct {
Firstname string
Lastname string
Years uint8
}
Затем у меня есть два экземпляра этой структуры, PersonA и PersonB.
PersonA := {"", "Obama", 6}
PersonB := {"President", "Carter", 8}
Я хочу написать функцию, которая копирует значения из PersonA в PersonB, учитывая некоторые условия для каждого поля (т.е. не пустые). Я знаю, как сделать это путем жесткого кодирования имен полей, но мне нужна функция, которая работает, даже если я изменяю структуру Person.
Я знаю, что отражения Go полезны, но проблема в получении и установке значений требует знания типов, если вы хотите использовать что-то вроде SetInt. Но есть ли "простой" способ сделать это?
** Аналогия с Javascript ** В Javascript вы можете просто выполнить (для свойства в someObject) цикл.
(for propt in personA) {
if personA[propt] != "" {
// do something
personB[propt] = personA[propt]
}
}
Опции, которые я исключил:
-
Отслеживание полей в каждой структуре на карте с последующим использованием комбинации FieldByName и коллекции функций Set * в отражающем пакете.
-
Создание цикла по полям Person вручную (ниже). Потому что я хочу сделать этот тип "обновления" для многих других структур (школа, животные и т.д.)
if PersonA.Firstname != "" { PersonB.Firstname = PersonA.Firstname }
...
if PersonA.Years != "" { PersonB.Years = PersonA.Years }
Приведенный ниже вопрос ставит меня на полпути, но все еще не распространяется на все структуры, для которых я хочу использовать эту функцию "обновления".
в Голанге, используя отражение, как вы устанавливаете значение поля структуры?
** Другие полезные ссылки ** GoLang: Доступ к свойству struct по имени