CGo에서 Union 필드를 Go 유형으로 변환
CGo에서 Union은 가장 큰 멤버를 수용하기에 충분한 크기의 바이트 배열로 표시됩니다. Go에서 특정 공용체 필드에 액세스하려면 일반적으로 포인터 변환이 필요합니다.
주어진 코드에서 값 공용체는 _GNetSnmpVarBind C 구조 내에서 액세스됩니다. 목표는 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에서 Union 필드에 액세스하는 방법: 단순화된 접근 방식?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!