Konvertieren von Union-Feldern in Go-Typen in Golang CGo
Bei der Arbeit mit C-Strukturen in Golang CGo kann der Zugriff auf Union-Felder eine Herausforderung sein. Ein häufiges Szenario beinhaltet den Zugriff auf das ui32v-Feld in einer Wertunion innerhalb einer C-Struktur, wie im folgenden Beispiel:
<code class="c">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 */ };</code>
Hinweis: In diesem Beispiel befinden wir uns auf einem 64- Bit-Plattform.
Fehlgeschlagener Ansatz: Konvertieren in uint64 und Casting
Ein erster Ansatz könnte das Konvertieren des Inhalts des Union-Felds in ein uint64 umfassen, vorausgesetzt, es stellt eine Speicheradresse dar. und dann diesen uint64 in einen *_Ctype_guint32 umwandeln. Dieser Ansatz führt jedoch zu einem Typkonvertierungsfehler.
Richtiger Ansatz: Verwendung der Adresse der Union
Der richtige Ansatz besteht stattdessen darin, die Adresse der Union zu verwenden Gewerkschaft selbst. In CGo wird eine Union als Byte-Array bereitgestellt, das groß genug ist, um sein größtes Mitglied aufzunehmen. In diesem Fall umfasst dieses Array acht Bytes ([8]Byte). Indem wir die Adresse dieses Arrays verwenden, können wir es direkt in den gewünschten Typ umwandeln.
Für C._GNetSnmpVarBind benannte Daten demonstriert der folgende Code diesen Ansatz:
<code class="go">guint32_star := *(**C.guint32)(unsafe.Pointer(&data.value[0]))</code>
Aufschlüsselung des Codes:
Dieser vereinfachte Ansatz ermöglicht den direkten Zugriff auf Union-Felder im Go-Code .
Das obige ist der detaillierte Inhalt vonWie greife ich in Go's CGo auf Union-Felder zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!