Union-Felder in Go-Typen in CGo konvertieren
In CGo werden Unions als Byte-Arrays dargestellt, die ausreichend groß sind, um das größte Mitglied aufzunehmen. Um auf ein bestimmtes Union-Feld in Go zuzugreifen, sind normalerweise Zeigerkonvertierungen erforderlich.
Im angegebenen Code wird auf eine Wert-Union innerhalb einer _GNetSnmpVarBind-C-Struktur zugegriffen. Das Ziel besteht darin, das Feld ui32v abzurufen, das ein Array von 32-Bit-Ganzzahlen ohne Vorzeichen enthält.
Verwendung eines Arrays [8]Byte zur Darstellung der Vereinigung, wie im Originalcode, ist korrekt. Die Konvertierung in einen Go-Typ, der auf ein C guint32 zeigt, kann jedoch mithilfe der Adresse des Arrays vereinfacht werden.
Der korrigierte Code verwendet die folgenden Schritte:
Erhalten Sie die Adresse des ersten Elements in der Wert-Vereinigung:
<code class="go">addr := &data.value[0]</code>
Wandeln Sie die Adresse in einen (*C .guint32) Typ mit unsafe.Pointer:
<code class="go">cast := (**C.guint32)(unsafe.Pointer(addr))</code>
Dereferenzieren Sie die Umwandlung, um den Wert des Union-Felds zu erhalten:
<code class="go">guint32_star := *cast</code>
Mit dieser Methode zeigt der Zeiger guint32_star direkt auf das Feld ui32v der C-Struktur _GNetSnmpVarBind. Es sind keine zusätzlichen Konvertierungen erforderlich, um den Zeiger zum Bearbeiten des Arrays von 32-Bit-Ganzzahlen ohne Vorzeichen zu verwenden.
Das obige ist der detaillierte Inhalt vonWie greife ich mit CGo auf Union-Felder in Go zu: Ein vereinfachter Ansatz?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!