Dalam C, kesatuan membenarkan berbilang ahli data untuk menduduki lokasi memori yang sama . Apabila bekerja dengan kesatuan dalam CGo, selalunya perlu menukar medan kesatuan kepada jenis Go yang sesuai untuk pemprosesan selanjutnya.
Pertimbangkan struct C berikut dengan kesatuan:
<code class="c">struct _GNetSnmpVarBind { ... union { gint32 i32; /* 32 bit signed */ guint32 ui32; /* 32 bit unsigned */ ... } value; /* value of the variable */ ... };</code>
Mari kita andaikan anda mahu mengakses medan ui32v dalam kesatuan nilai pada platform 64-bit.
Biasanya, seseorang akan menulis fungsi pembalut C untuk setiap elemen kesatuan. Walau bagaimanapun, untuk tujuan pendidikan, mari kita terokai cara melakukannya dalam Go.
Penukaran daripada Cgo Union Array kepada Go Pointer
Pada mulanya, kesatuan didedahkan sebagai Go tatasusunan bait [8]bait. Matlamatnya adalah untuk menukar tatasusunan ini kepada jenis Go yang menunjuk kepada tatasusunan C guint32.
Secara tradisinya, ini boleh dilakukan seperti berikut:
<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>
Pendekatan ini, bagaimanapun, menghadapi ralat penukaran antara uint64 (hasil binari.Baca) dan tidak selamat.Penunjuk.
Kaedah Penukaran Ringkas
Penyelesaian yang lebih mudah ialah menggunakan alamat bait tatasusunan itu sendiri, yang merupakan penuding kepada lokasi ingatan medan kesatuan:
<code class="go">guint32_star := *(**C.guint32)(unsafe.Pointer(&data.value[0]))</code>
Teknik ini secara berkesan menterjemahkan alamat tatasusunan bait kepada penuding kepada jenis C yang dikehendaki, memintas keperluan untuk penukaran perantara.
Penunjuk ini kemudiannya boleh digunakan bersama dengan fungsi sedia ada, seperti menukar tatasusunan C guint32s kepada rentetan:
<code class="go">guint32_star := union_to_guint32_ptr(data.value) result += OidArrayToString(guint32_star, data.value_len)</code>
Pendekatan ini sangat memudahkan akses dan manipulasi medan kesatuan dalam aplikasi Golang CGo.
Atas ialah kandungan terperinci Bagaimana untuk Menukar Medan C Union kepada Jenis Go dalam Golang CGo?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!