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:
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.
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