"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 acceder a los campos sindicales en el CGo de Go?

¿Cómo acceder a los campos sindicales en el CGo de Go?

Publicado el 2024-11-06
Navegar:847

How to Access Union Fields in Go\'s CGo?

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:

  • &data. value[0] obtiene la dirección del primer byte en la unión de valores.
  • unsafe.Pointer(&data.value[0]) convierte esta dirección en un puntero de tipo unsafe.Pointer.
  • (**C.guint32)(unsafe.Pointer(&data.value[0])) interpreta la memoria a la que apunta unsafe.Pointer(&data.value[0]) como **C.guint32, accediendo efectivamente a ui32v campo como puntero a un guint32.

Este enfoque simplificado permite el acceso directo a los campos de unión en el código Go.

Ú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