CGo で共用体フィールドを Go 型に変換する
CGo では、共用体は最大のメンバーを保持するのに十分なサイズのバイト配列として表されます。 Go で特定の共用体フィールドにアクセスするには、通常、ポインター変換が必要です。
指定されたコードでは、_GNetSnmpVarBind C 構造内で value 共用体にアクセスしています。目的は、32 ビット符号なし整数の配列を保持する ui32v フィールドを取得することです。
[8]byte 配列を使用して共用体を表します。元のコードと同様に、正しいです。ただし、C guint32 を指す Go 型への変換は、配列のアドレスを使用して簡略化できます。
修正されたコードでは、次の手順が使用されます。
value 共用体の最初の要素のアドレスを取得します:
<code class="go">addr := &data.value[0]</code>
アドレスを にキャストします(*C .guint32)unsafe.Pointerを使用した型:
<code class="go">cast := (**C.guint32)(unsafe.Pointer(addr))</code>
キャストを逆参照して共用体フィールドの値を取得します:
<code class="go">guint32_star := *cast</code>
このメソッドを使用すると、ポインター guint32_star は C _GNetSnmpVarBind 構造体の ui32v フィールドを直接指します。ポインターを使用して 32 ビット符号なし整数の配列を操作する場合、追加の変換は必要ありません。
以上がCGo を使用して Go のユニオンフィールドにアクセスする方法: 簡略化されたアプローチ?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。