Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menukar Medan C Union kepada Penunjuk Go Guint32 Menggunakan CGo?
Menukar Medan kesatuan C kepada Go Type Menggunakan CGo
CGo, jambatan antara Go dan C, mewakili kesatuan C sebagai tatasusunan bait dengan saiz yang cukup besar untuk menampung ahli kesatuan terbesar. Dalam kes ini, kami berurusan dengan kesatuan C yang mengandungi medan penuding guint32 bernama ui32v.
Masalah: Menukar kepada Penunjuk Go Guint32
Matlamatnya ialah untuk menukar tatasusunan 8 bait yang mewakili medan ui32v kesatuan kepada jenis Go yang menunjuk kepada guint32 C. Semasa menghantar ke uintptr dan kemudian ke *_Ctype_guint32 atau menggunakan tidak selamat.Penunjuk pada mulanya kelihatan seperti pilihan yang berdaya maju, ia mengakibatkan ralat.
Penyelesaian: Menggunakan Alamat Tatasusunan
The kunci untuk menyelesaikan masalah ini terletak pada menggunakan alamat tatasusunan bait, bukan tatasusunan itu sendiri. Daripada menukar tatasusunan bait kepada uint64 dan kemudian menghantarnya ke penuding, kami boleh menggunakan alamat tatasusunan untuk mencipta penuding secara langsung.
Coretan kod berikut menunjukkan pendekatan yang betul:
<code class="go">guint32_star := *(**C.guint32)(unsafe.Pointer(&data.value[0]))</code>
Di mana data ialah struct C._GNetSnmpVarBind.
Pecahan Penukaran
Langkah pertama ialah mendapatkan alamat elemen pertama dalam tatasusunan bait, yang secara berkesan adalah alamat kesatuan. Kemudian, kami menggunakan tidak selamat.Penunjuk untuk menghantar alamat ini ke penuding kepada jenis Pergi yang diingini. Dalam kes ini, kami menghantarnya ke penuding ke C.guint32, dengan berkesan mentafsir tatasusunan bait sebagai medan guint32 *ui32v. Akhir sekali, kami tidak merujuk penuding untuk mendapatkan penuding guint32 yang sebenar.
Dengan menggunakan pendekatan ini, kami boleh memudahkan proses penukaran dan mendapatkan semula medan penunjuk guint32 dari kesatuan dengan betul.
Atas ialah kandungan terperinci Bagaimana untuk Menukar Medan C Union kepada Penunjuk Go Guint32 Menggunakan CGo?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!