Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengakses Medan Kesatuan dalam CGo Go?

Bagaimana untuk Mengakses Medan Kesatuan dalam CGo Go?

DDD
DDDasal
2024-11-01 07:45:02822semak imbas

How to Access Union Fields in Go's CGo?

Menukar Medan Kesatuan kepada Jenis Go dalam Golang CGo

Apabila bekerja dengan struktur C dalam Golang CGo, mengakses medan kesatuan boleh menjadi satu cabaran. Senario biasa melibatkan mengakses medan ui32v dalam kesatuan nilai dalam struktur C, seperti dalam contoh berikut:

<code class="c">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 */
};</code>

Nota: Dalam contoh ini, kita berada di 64- bit platform.

Pendekatan Gagal: Menukar kepada uint64 dan Casting

Pendekatan awal mungkin melibatkan penukaran kandungan medan kesatuan kepada uint64, dengan mengandaikan ia mewakili alamat memori, dan kemudian menghantar uint64 itu kepada *_Ctype_guint32. Walau bagaimanapun, pendekatan ini akan mengakibatkan ralat penukaran jenis.

Pendekatan Betul: Menggunakan Alamat Kesatuan

Sebaliknya, pendekatan yang betul melibatkan penggunaan alamat kesatuan itu sendiri. Dalam CGo, kesatuan didedahkan sebagai tatasusunan bait yang cukup besar untuk menampung ahli terbesarnya. Dalam kes ini, tatasusunan itu ialah lapan bait ([8]bait). Dengan menggunakan alamat tatasusunan ini, kami boleh menghantarnya terus kepada jenis yang dikehendaki.

Untuk data bernama C._GNetSnmpVarBind, kod berikut menunjukkan pendekatan ini:

<code class="go">guint32_star := *(**C.guint32)(unsafe.Pointer(&data.value[0]))</code>

Pecahan Kod:

  • &data.value[0] memperoleh alamat bait pertama dalam penyatuan nilai.
  • unsafe.Pointer(&data.value[ 0]) menukar alamat ini kepada penunjuk jenis tidak selamat.Penunjuk.
  • (**C.guint32)(unsafe.Penunjuk(&data.value[0])) mentafsir memori yang ditunjuk oleh tidak selamat.Penunjuk (&data.value[0]) sebagai **C.guint32, dengan berkesan mengakses medan ui32v sebagai penunjuk kepada guint32.

Pendekatan mudah ini membolehkan akses terus ke medan kesatuan dalam kod Go .

Atas ialah kandungan terperinci Bagaimana untuk Mengakses Medan Kesatuan dalam CGo Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn