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

Mary-Kate Olsen
Lepaskan: 2024-11-01 13:58:02
asal
790 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!