«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как использовать отражение для изменения полей структуры с помощью CanSet() и структур?

Как использовать отражение для изменения полей структуры с помощью CanSet() и структур?

Опубликовано 9 ноября 2024 г.
Просматривать:536

How to Use Reflection to Modify Struct Fields with CanSet() and Structs?

Использование отражения для изменения полей структуры: CanSet() и структур

При использовании отражения для изменения полей структуры важно понимать принципы за доступностью и модификацией полей.

CanSet() для Структуры

В вашем примере вы столкнулись с CanSet(), возвращающим false для полей структуры. Это связано с тем, что по умолчанию Go не позволяет изменять неэкспортируемые (частные) поля структуры с помощью отражения. Это мера безопасности для предотвращения случайного или злонамеренного изменения внутреннего состояния структуры.

Решение проблем

Чтобы установить значения полей структуры с помощью отражения, рассмотрите следующее шаги:

  1. Изменить значение: При вызове функции SetField() передайте указатель на struct, а не само значение структуры. Это позволяет вам изменять фактическую структуру, а не ее копию.
  2. Используйте Value.Elem() для указателей: Если вы передаете указатель на структуру, вам нужно использовать Reflection.ValueOf (source).Elem() для получения отражения.Значение указанной структуры. Это приведет к фактическому значению структуры.
  3. Используйте FieldByName для доступа к полю: Вместо циклического перебора всех полей в структуре используйте v.FieldByName(fieldName) для доступа к конкретному полю, которое вы хотите изменить. Это гарантирует, что вы получаете доступ к правильному полю и повышаете эффективность.

Модифицированный код

Вот измененный код, который устраняет проблемы:

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.

Заявление о выпуске Эта статья воспроизведена по адресу: 1729741550. В случае каких-либо нарушений, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3