Изучение отражения с помощью SetString для структур
Reflection предоставляет мощные инструменты для динамического управления структурами Go. В этом примере мы сталкиваемся с распространенной проблемой при попытке установить значение поля структуры с помощью отражения: CanSet() всегда возвращает false. Это препятствие препятствует модификации полей, ставя нас в затруднительное положение.
Выявление ловушек
Приведенный фрагмент кода подчеркивает две фундаментальные ошибки:
Решение проблем
После устранения этих ошибок мы можем усовершенствовать наш код:
func SetField(source interface{}, fieldName string, fieldValue string) {
v := reflect.ValueOf(source).Elem() // Obtain the value of the pointed object
fmt.Println(v.FieldByName(fieldName).CanSet())
if v.FieldByName(fieldName).CanSet() {
v.FieldByName(fieldName).SetString(fieldValue)
}
}
В модифицированной функции SetField() мы:
Код в действии
Благодаря этим изменениям код теперь успешно работает обновляет значение Field1:
func main() {
source := ProductionInfo{}
source.StructA = append(source.StructA, Entry{Field1: "A", Field2: 2})
fmt.Println("Before: ", source.StructA[0])
SetField(&source.StructA[0], "Field1", "NEW_VALUE")
fmt.Println("After: ", source.StructA[0])
}
Вывод:
Before: {A 2} true After: {NEW_VALUE 2}
Результат демонстрирует успешное изменение поля Field1 в структуре Entry.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3