」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何存取Go的CGo中的聯合字段?

如何存取Go的CGo中的聯合字段?

發佈於2024-11-06
瀏覽:651

How to Access Union Fields in Go\'s CGo?

在Golang CGo 中將Union 字段轉換為Go 類型

在Golang CGo 中使用C 結構時,訪問union 字段可能是一個挑戰。常見場景涉及存取 C 結構內值聯合中的 ui32v 字段,如下例所示:

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 */
};

注意:在此範例中,我們在 64 位元平台上。

失敗的方法:轉換為uint64 並強制轉換

最初的方法可能涉及將union 欄位的內容轉換為uint64,假設它表示記憶體位址,然後將該uint64 轉換為*_Ctype_guint32。然而,這種方法會導致類型轉換錯誤。

正確的方法:使用 Union 的地址

相反,正確的方法是使用 Union 的地址工會本身。在 CGo 中,聯合被公開為一個足以容納其最大成員的位元組數組。在本例中,此數組為八個位元組 ([8]byte)。透過使用該陣列的位址,我們可以直接將其轉換為所需的類型。

對於C._GNetSnmpVarBind 命名數據,以下程式碼示範了這種方法:

guint32_star := *(**C.guint32)(unsafe.Pointer(&data.value[0]))

代碼細分:

  • &data。 value[0] 取得值聯合中第一個位元組的位址。
  • unsafe.Pointer(&data.value[0]) 將此位址轉換為 unsafe.Pointer 類型的指標。
  • (**C.guint32)(unsafe.Pointer(&data.value[0])) 將unsafe.Pointer(&data.value[0]) 所指向的記憶體解釋為**C.guint32,有效存取ui32v字段作為指向guint32 的指標。

這種簡化的方法允許直接存取 Go 程式碼中的聯合欄位。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3