"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo utilizar la reflexión para modificar campos de estructura con CanSet() y Structs?

¿Cómo utilizar la reflexión para modificar campos de estructura con CanSet() y Structs?

Publicado el 2024-11-09
Navegar:536

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

Uso de la reflexión para modificar campos de estructura: CanSet() y Structs

Al utilizar la reflexión para modificar campos de estructura, es importante comprender los principios detrás de la accesibilidad y modificación de campos.

CanSet() para estructuras

En su ejemplo, encontró que CanSet() devuelve falso para campos de estructura. Esto se debe a que, de forma predeterminada, Go no permite modificar campos no exportados (privados) de una estructura mediante la reflexión. Esta es una medida de seguridad para evitar modificaciones accidentales o maliciosas del estado de la estructura interna.

Abordar los problemas

Para establecer los valores de los campos de la estructura mediante la reflexión, considere lo siguiente pasos:

  1. Modificar un valor: Al llamar a la función SetField(), pase el puntero a la estructura, no al valor de la estructura en sí. Esto le permite modificar la estructura real, no una copia.
  2. Use Value.Elem() para punteros: Si pasa un puntero a la estructura, debe usar reflect.ValueOf (fuente).Elem() para obtener el valor reflejado de la estructura puntiaguda. Esto navega al valor de estructura real.
  3. Use FieldByName para acceder al campo: En lugar de recorrer todos los campos de la estructura, use v.FieldByName(fieldName) para acceder al campo específico que desea para modificar. Esto garantiza que accede al campo correcto y es más eficiente.

Código modificado

Aquí está el código modificado que soluciona los problemas:

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])
}

Este código ahora modificará exitosamente el valor del Campo1 de la estructura de Entrada.

Declaración de liberación Este artículo se reimprime en: 1729741550 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3