Conversión de campos de unión en tipos Go en Golang CGo
Cuando se trabaja con estructuras C en Golang CGo, acceder a los campos de unión puede ser un desafío. Un escenario común implica acceder al campo ui32v en una unión de valores dentro de una estructura C, como en el siguiente ejemplo:
struct _GNetSnmpVarBind {
guint32 *oid; /* name of the variable */
gsize oid_len; /* length of the name */
GNetSnmpVarBindType type; /* variable type / exception */
union {
gint32 i32; /* 32 bit signed */
guint32 ui32; /* 32 bit unsigned */
gint64 i64; /* 64 bit signed */
guint64 ui64; /* 64 bit unsigned */
guint8 *ui8v; /* 8 bit unsigned vector */
guint32 *ui32v; /* 32 bit unsigned vector */
} value; /* value of the variable */
gsize value_len; /* length of a vector in bytes */
};
Nota: En este ejemplo, estamos en una plataforma de 64 bits.
Enfoque fallido: conversión a uint64 y transmisión
Un enfoque inicial podría implicar convertir el contenido del campo de unión a un uint64, suponiendo que representa una dirección de memoria, y luego convertir ese uint64 a un *_Ctype_guint32. Sin embargo, este enfoque dará como resultado un error de conversión de tipo.
Enfoque correcto: usar la dirección de la Unión
En cambio, el enfoque correcto implica usar la dirección del sindicato mismo. En CGo, una unión se expone como una matriz de bytes lo suficientemente grande como para contener a su miembro más grande. En este caso, esa matriz tiene ocho bytes ([8]bytes). Al usar la dirección de esta matriz, podemos convertirla directamente al tipo deseado.
Para datos con nombre C._GNetSnmpVarBind, el siguiente código demuestra este enfoque:
guint32_star := *(**C.guint32)(unsafe.Pointer(&data.value[0]))
Desglose del código:
Este enfoque simplificado permite el acceso directo a los campos de unión en el código Go.
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