Heim >Backend-Entwicklung >Golang >Detaillierte Erläuterung der häufig verwendeten Datenkonvertierung und -verwendung in CGO-Projekten
Dieser Artikel wird in der Tutorial-Kolumne von golang bereitgestellt, um Ihnen die häufig verwendete Datenkonvertierung und -verwendung in praktischen CGO-Projekten vorzustellen. Ich hoffe, dass er Freunden in Not hilfreich sein wird!
Sie müssen die entsprechende Umgebung bereitstellen und über grundlegende Wissenspunkte verfügen. Dies ist kein populärwissenschaftlicher Artikel. Er dient hauptsächlich der Typkonvertierung und der Verwendung in tatsächlichen Projekten sowie der Übergabe von Funktionsaufrufparametern an dynamische Bibliotheken. und erhalten Sie
1. Start unterstützt CGO
3. Verstehen Sie die Syntax von GO und C
4 Ich bin ein Neuling, ich kann es nur grob betrachten.) Es wird hauptsächlich zum Debuggen von C selbst verwendet
Liste der grundlegenden Datentypen
var deviceIp string cdeviceIp := C.CString(deviceIp) defer C.free(unsafe.Pointer(cdeviceIp))
Cs char * /char[] wird in gos String umgewandelt
serialNo := make([]byte, 0) for _, v := range sSerialNumber { if v != 0 { serialNo = append(serialNo, byte(v)) } }Achten Sie darauf die zuvor erwähnten Zeichen Der Unterschied zwischen Arrays und Strings.
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 ;}Wenn dieser Code durch Go-Logik ersetzt und direkt in Go gelesen wird, wird angezeigt, dass unMetaData die Definition nicht finden kann. Wenn es andere erfolgreiche Lesemethoden gibt, teilen Sie uns dies bitte mit.
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);}Der dritte Schritt: C.pfRealDataCallBack (C.CGopfRealDataCallBack) muss am deklariert werden import C, Andernfalls wird der Aufruf nicht wirksam void* und unsafe.Pointerunsafe.Pointer wird als Übertragungsbrücke für alle Datentypen bezeichnet void* wird angetroffen, unsicher. Der Zeiger kann beim Empfangen oder Senden verwendet werden. Die Konvertierung bestimmter Typen erfordert eine erzwungene Konvertierung basierend auf dem tatsächlichen Typ. Zum Beispiel:
lpOutBuff := unsafe.Pointer(C.malloc(1024))Dieser 1024 kann je nach tatsächlicher Situation geändert werden und ist kein Allheilmittel.
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>
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der häufig verwendeten Datenkonvertierung und -verwendung in CGO-Projekten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!