Dalam CGo Go, kesatuan C diwakili sebagai tatasusunan bait, dengan saiz ditentukan oleh kesatuan ahli terbesar. Ini membolehkan akses terus kepada kandungan kesatuan. Walau bagaimanapun, menukar medan kesatuan kepada jenis Go memerlukan operasi penuding.
Pertimbangkan struct C berikut yang mengandungi kesatuan:
<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>
Untuk mengakses medan ui32v dalam Go, seseorang boleh cuba menukar tatasusunan bait kepada penuding menggunakan:
<code class="go">func union_to_guint32_ptr(cbytes [8]byte) (result *_Ctype_guint32) { buf := bytes.NewBuffer(cbytes[:]) var ptr uint64 if err := binary.Read(buf, binary.LittleEndian, &ptr); err == nil { return (*_Ctype_guint32)(unsafe.Pointer(ptr)) } return nil }</code>
Walau bagaimanapun, pendekatan ini gagal kerana isu penukaran jenis. Untuk menyelesaikan masalah ini, kita boleh terus menggunakan alamat tatasusunan bait sebagai penuding:
<code class="go">guint32_star := *(**C.guint32)(unsafe.Pointer(&data.value[0]))</code>
Operasi ini mengekstrak alamat elemen pertama dalam tatasusunan bait, dengan berkesan mendapatkan alamat kesatuan itu sendiri. Dengan memanipulasi jenis penunjuk menggunakan tidak selamat.Penunjuk, kami mentafsir semula memori sebagai penunjuk kepada jenis yang diingini, (*C.guint32). Akhir sekali, membatalkan rujukan keputusan memberi kita akses kepada kandungan ahli kesatuan.
Dengan memahami perwakilan dan manipulasi kesatuan dalam CGo, pembangun boleh bekerja dengan berkesan dengan struktur data C kompleks dalam program Go mereka.
Atas ialah kandungan terperinci Bagaimanakah anda menukar medan kesatuan C kepada jenis Go dalam CGo?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!