Artikel ini ditulis oleh ruangan tutorial golang untuk memperkenalkan anda kepada penukaran dan penggunaan data yang biasa digunakan dalam projek praktikal CGO. Saya harap ia dapat membantu rakan-rakan yang memerlukan !
Anda perlu menggunakan persekitaran yang berkaitan dan mempunyai mata pengetahuan asas Ini bukan artikel sains yang popular, ia adalah untuk jenis yang digunakan dalam projek sebenar . Penukaran dan penggunaan, menghantar dan menerima parameter panggilan fungsi untuk pustaka dinamik
1, mula menyokong CGO
2 4 , adalah lebih baik untuk mengetahui sintaks makefile atau shell asas (bermakna saya tidak memahaminya, saya seorang noob, dan saya hanya boleh membaca garis kasar), terutamanya kerana anda perlu menggunakannya semasa menyahpepijat C sendiri
Jika semua orang tahu semuanya, sila klik pada pautan literasi: chai2010.cn/advanced-go-programmin...
Memandangkan GO menyokong panggilan bahasa C , jadi hanya penukaran dengan C disenaraikan Bagi C, ia perlu ditukar kepada bahasa C sebelum ia boleh dipanggil dengan jayanya. Perlu diingat bahawa setiap pembolehubah C adalah terhad untuk digunakan dalam satu pakej. Jika anda ingin menggunakannya merentasi pakej, sila gunakan GO untuk merangkumnya. Jika tidak, ralat panggilan akan digesa dan pembolehubah C tidak dapat ditemui.
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 ;}
3. Panggil sahaja ia sebagai fungsi biasa dalam bahasa GO.
Lihat contoh kod:
Pengisytiharan fungsi 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);}
lpOutBuff := unsafe.Pointer(C.malloc(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>
Atas ialah kandungan terperinci Penjelasan terperinci tentang penukaran dan penggunaan data yang biasa digunakan dalam projek CGO. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!