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