이 글은 golang의 튜토리얼 칼럼에서 제공하는 CGO 실무 프로젝트에서 흔히 사용되는 데이터 변환 및 사용법을 소개하는 글이니 도움이 필요한 친구들에게 도움이 되었으면 좋겠습니다!
관련 환경을 배포하고 기본 지식이 있어야 합니다. 이 글은 주로 유형 변환 및 실제 프로젝트에서의 사용과 동적 라이브러리에서 함수 호출 매개변수 전달을 위한 내용입니다. .go 환경, CGO 시작 및 지원
2. g++를 미리 설치하세요
3. GO 및 C
4의 구문을 이해하는 것이 가장 좋습니다. 이해합니다. 저는 멍청합니다. 대략적으로만 볼 수 있습니다.) 주로 C를 직접 디버깅하는 데 사용됩니다
완전히 이해했다면 읽기 쓰기 링크를 클릭하세요: chai2010.cn/advanced-go-programmin...
C.CString은 C를 호출하는 표준 라이브러리입니다. 새로운 메모리 공간에 적용되며 이를 해제하려면 C.free를 호출해야 합니다. 그렇지 않으면 메모리 누수가 발생합니다.
var deviceIp string cdeviceIp := C.CString(deviceIp) defer C.free(unsafe.Pointer(cdeviceIp))
이를 얻는 방법은 추가를 사용하여 문자열에 바이트를 추가하는 것입니다
serialNo := make([]byte, 0) for _, v := range sSerialNumber { if v != 0 { serialNo = append(serialNo, byte(v)) } }주의하세요 앞서 언급한 문자 배열과 문자열의 차이점.
var keyFilePath = "/home/docker/path/file.jpg" for i, b := range keyFilePath { szKeyFilePath[i] = C.CHAR(b) }
void CGopfFaceSnapCallBack(CHAR *szBuffer, LONG lSize, void *pUsrData) { PU_META_DATA *pstMetaData = 0; int ret = Wrapper_IVS_User_GetMetaData(szBuffer, lSize, TARGET, &pstMetaData); if (ret == PU_FALSE ){ return ; } PU_UserData *pstMetaUserData = pstMetaData->pstMetaUserData; char name[100]={0}; char cardID[100]={0}; for(UINT uIndex = 0; uIndex usValidNumber; ++uIndex){ //printf("pstMetaData eType : %x\n", pstMetaUserData[uIndex].eType); if (pstMetaUserData[uIndex].eType == FACE_INFO){ strcpy(cardID, pstMetaUserData[uIndex].unMetaData.stFaceInfo.cardID); strcpy(name, pstMetaUserData[uIndex].unMetaData.stFaceInfo.name); printf("GopfFaceSnapCallBack unMetaData.stFaceInfo cardID : %s\n", pstMetaUserData[uIndex].unMetaData.stFaceInfo.cardID); printf("GopfFaceSnapCallBack unMetaData.stFaceInfo name : %s\n", pstMetaUserData[uIndex].unMetaData.stFaceInfo.name); GopfFaceSnapCallBack(pstMetaUserData[uIndex].unMetaData.stFaceInfo.cardID,pUsrData); break ; } } Wrapper_IVS_User_FreeMetaData(&pstMetaData); return ;}이 코드를 Go 로직으로 대체하고 Go에서 직접 읽으면 unMetaData가 정의를 찾을 수 없다는 메시지가 표시됩니다. 다른 성공적인 독서 방법이 있다면 알려주십시오.
2. CGO에서는 이 단계를 생략해도 된다고 하더군요. 아직까지 회사의 조상 코드를 이렇게 작성해 본 적은 없습니다. 그냥 사용하세요.
3. GO 언어의 공통 함수로 직접 호출하면 됩니다.
코드 예제 보기:
C 함수 선언:
typedef VOID (CALLBACK *pfRealDataCallBack)(CHAR *szBuffer, LONG lSize, VOID *pUsrData);코드의 첫 번째 단계:
//export GopfRealDataCallBackfunc GopfRealDataCallBack(szBuffer *C.CHAR, lSize C.LONG, pUsrData unsafe.Pointer) { fmt.Println(szBuffer,lSize,pUsrData)}두 번째 단계:
extern void GopfRealDataCallBack(CHAR *szBuffer, LONG lSize, void *pUsrData);void CGopfRealDataCallBack(CHAR *szBuffer, LONG lSize, void *pUsrData){ return GopfRealDataCallBack(szBuffer,lSize,pUsrData);}세 번째 단계: C.pfRealDataCallBack(C.CGopfRealDataCallBack), 선언해야 함 import C, 그렇지 않으면 호출이 적용되지 않습니다
lpOutBuff := unsafe.Pointer(C.malloc(1024))이 1024는 실제 상황에 따라 수정될 수 있으며 만병통치약이 아닙니다.
results := (*C.struct_name)(C.malloc(C.size_t(C.sizeof_struct_name * C.int(resLen)))) defer C.free(unsafe.Pointer(results))
struct_name换成具体的结构体名称,申请了空间要释放,GO检测不到C的部分。
for i := 0; i <p>struct_name换成具体的结构体名称,uintptr是元素内存地址,根据偏移量获取元素。<code>go for i := 0; i <span class="rm-link-color"> </span> </code></p><p class="meta" style="margin: 35px 0px;"><em class="icon tags"></em></p>
위 내용은 CGO 프로젝트에서 일반적으로 사용되는 데이터 변환 및 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!