Использование отражения для изменения полей структуры: CanSet() и структур
При использовании отражения для изменения полей структуры важно понимать принципы за доступностью и модификацией полей.
CanSet() для Структуры
В вашем примере вы столкнулись с CanSet(), возвращающим false для полей структуры. Это связано с тем, что по умолчанию Go не позволяет изменять неэкспортируемые (частные) поля структуры с помощью отражения. Это мера безопасности для предотвращения случайного или злонамеренного изменения внутреннего состояния структуры.
Решение проблем
Чтобы установить значения полей структуры с помощью отражения, рассмотрите следующее шаги:
Модифицированный код
Вот измененный код, который устраняет проблемы:
func SetField(source interface{}, fieldName string, fieldValue string) {
v := reflect.ValueOf(source).Elem()
fmt.Println(v.FieldByName(fieldName).CanSet())
if v.FieldByName(fieldName).CanSet() {
v.FieldByName(fieldName).SetString(fieldValue)
}
}
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])
}
Теперь этот код успешно изменит значение Field1 структуры Entry.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3