Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menukar Medan C Union kepada Jenis Go dalam Golang CGo?

Bagaimana untuk Menukar Medan C Union kepada Jenis Go dalam Golang CGo?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-01 13:58:02872semak imbas

How to Convert a C Union Field to a Go Type in Golang CGo?

Golang CGo: Menukar Medan Kesatuan kepada Jenis Pergi

Pernyataan Masalah

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.

Penyelesaian

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, &amp;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(&amp;data.value[0]))</code>

Teknik ini secara berkesan menterjemahkan alamat tatasusunan bait kepada penuding kepada jenis C yang dikehendaki, memintas keperluan untuk penukaran perantara.

Penggunaan Bersama Kefungsian Sedia Ada

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!

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