Obtención de direcciones de campo en estructuras anidadas mediante reflexión
En este escenario, desea recorrer y examinar estructuras anidadas y obtener las direcciones de estructuras no anidadas. -campos de puntero dentro de ellos. Al utilizar la reflexión, tiene una función que itera a través de campos pero encuentra dificultades para obtener la dirección de memoria de campos que no son de puntero ubicados en subestructuras incrustadas.
Para rectificar este problema, es crucial tener en cuenta que valueField.Interface() no no proporciona el resultado esperado porque devuelve el valor real almacenado dentro del campo, lo cual no es válido cuando se trabaja con tipos que no son de puntero.
La solución radica en modificar la función InspectStructV para recibir un reflect.Value en lugar de una interfaz{}. Esto le permite manipular directamente el objeto de reflexión y recuperar la dirección del campo. Además, cuando se llama recursivamente a InspectStructV para campos de estructura, valueField, que anteriormente contenía el valor de la interfaz, ahora apunta directamente al valor de reflexión de la estructura anidada, lo que garantiza que la dirección se pueda recuperar correctamente.
Aquí está el código revisado fragmento:
func InspectStructV(val reflect.Value) {
if val.Kind() == reflect.Interface && !val.IsNil() {
elm := val.Elem()
if elm.Kind() == reflect.Ptr && !elm.IsNil() && elm.Elem().Kind() == reflect.Ptr {
val = elm
}
}
if val.Kind() == reflect.Ptr {
val = val.Elem()
}
for i := 0; i Al realizar estos cambios, podrá recuperar con éxito las direcciones de memoria de campos que no son de puntero incluso cuando residan dentro de estructuras anidadas.
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