gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

詳解CGO項目中常用的數(shù)據(jù)轉(zhuǎn)換及使用

本文由golang教程欄目給大家介紹關(guān)于CGO實(shí)戰(zhàn)項目中常用的數(shù)據(jù)轉(zhuǎn)換和使用,希望對需要的朋友有所幫助!

前言

需要部署好相關(guān)環(huán)境和具備基本的知識點(diǎn),這并非是一篇科普的文章,主要是針對實(shí)際項目中用到的類型轉(zhuǎn)換和使用,針對動態(tài)庫的函數(shù)調(diào)用參數(shù)傳遞和接收
1、GO環(huán)境,啟動支持CGO
2、事先安裝g++
3、看得懂GO和C的語法
4、最好會基本的makefile或者shell語法(表示我不懂,是個菜雞,只會看個大概)主要是自己調(diào)試C需要用到
如果大家是一清二白的,請點(diǎn)擊掃盲鏈接:chai2010.cn/advanced-go-programmin…

基本數(shù)據(jù)類型一覽

詳解CGO項目中常用的數(shù)據(jù)轉(zhuǎn)換及使用

由于GO支持 C語言的調(diào)用,所以只列出了和C的轉(zhuǎn)換,至于C++,需要轉(zhuǎn)換成C語言才可以成功調(diào)用。需要注意的是:每個C的變量都是限定在一個包內(nèi)使用的,如果想跨包使用,請用GO封裝一層,否則會提示調(diào)用錯誤,找不到這個C變量。

項目中用到的數(shù)據(jù)類型轉(zhuǎn)換

go的string轉(zhuǎn)換成C

C的字符串就是一個字符數(shù)組的特例,簡單的說就是一個字符數(shù)組以0結(jié)尾的數(shù)組就是字符串,所以不屬于基本數(shù)據(jù)類型 。
C.CString是調(diào)用C的標(biāo)準(zhǔn)庫,申請了新的內(nèi)存空間,需要調(diào)用C.free釋放,否則會內(nèi)存泄漏。

    var  deviceIp string     cdeviceIp := C.CString(deviceIp)     defer C.free(unsafe.Pointer(cdeviceIp))
C的char * /char[] 轉(zhuǎn)換成go的string

調(diào)用C的標(biāo)準(zhǔn)庫 C.GoString,這個函數(shù)不會產(chǎn)生新的內(nèi)存空間,創(chuàng)建的是一個副本,也不會釋放內(nèi)存空間。

C的字節(jié)數(shù)組轉(zhuǎn)Go的string

比方說C的類型是:BYTE sSerialNumber[SERIALNO_LEN];
獲取的方式就是利用append添加字節(jié)到字符串

    serialNo := make([]byte, 0)     for _, v := range sSerialNumber {         if v != 0 {             serialNo = append(serialNo, byte(v))         }     }

注意前面提到的字符數(shù)組和字符串的區(qū)別。

Go的string轉(zhuǎn)C的字符數(shù)組

類型:CHAR szKeyFilePath[PU_CERT_FILE_PATH_MAX];

    var keyFilePath = "/home/docker/path/file.jpg"     for i, b := range keyFilePath {         szKeyFilePath[i] = C.CHAR(b)     }

聯(lián)合體的數(shù)據(jù)獲取

接華為攝像頭的數(shù)據(jù)回調(diào)的時候有聯(lián)合體類型數(shù)據(jù)的獲取,當(dāng)作普通結(jié)構(gòu)體獲取的時候編譯會一直提示找不到這個結(jié)構(gòu)體,后面不得已,在C代碼里面獲取到聯(lián)合體的數(shù)據(jù)之后,轉(zhuǎn)換成基本數(shù)據(jù)類型,再重新Go調(diào)用。貼一個代碼片斷,人臉識別回調(diào)獲取的數(shù)據(jù)。不用糾結(jié)前后文,看數(shù)據(jù)類型的獲取就好。

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 < pstMetaData->usValidNumber; ++uIndex){        //printf("pstMetaData eType : %xn", 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 : %sn", pstMetaUserData[uIndex].unMetaData.stFaceInfo.cardID);             printf("GopfFaceSnapCallBack unMetaData.stFaceInfo name : %sn", pstMetaUserData[uIndex].unMetaData.stFaceInfo.name);             GopfFaceSnapCallBack(pstMetaUserData[uIndex].unMetaData.stFaceInfo.cardID,pUsrData);             break ;         }     }     Wrapper_IVS_User_FreeMetaData(&pstMetaData);     return ;}

如果這段代碼換成Go的邏輯,直接在Go里面去讀取的話會提示unMetaData 找不到定義。有其他成功讀取方式的,還請告知。

C的回調(diào)函數(shù)的調(diào)用

1、先Go代碼實(shí)現(xiàn)數(shù)據(jù)類型一致的函數(shù),利用//export 導(dǎo)出為C函數(shù),如果發(fā)現(xiàn)回調(diào)沒進(jìn)來,首先檢查一下數(shù)據(jù)類型是否正確,再檢查觸發(fā)條件是否滿足。這一步是為了在Go語言里面接收到C語言的回調(diào)數(shù)據(jù),也就是回調(diào)后的數(shù)據(jù)是在這個函數(shù)里面獲取。
2、CGO調(diào)用C函數(shù),有同事說這一步可以不用,直接在Go里面調(diào)用第一步的函數(shù)就可以,我還沒試過,公司祖?zhèn)鞯拇a就是這么寫的,也就直接照用了。
3、在GO語言里面當(dāng)作常用函數(shù)直接調(diào)用就好。
看代碼示例:
C的函數(shù)聲明:

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 上聲明,否則調(diào)用不生效

void*和unsafe.Pointer

unsafe.Pointer號稱是所有數(shù)據(jù)類型的轉(zhuǎn)接橋梁,在語言層面兩個可以認(rèn)為等同的,當(dāng)碰到void*可以用unsafe.Pointer來接收或者傳遞,具體類型的轉(zhuǎn)換,需要根據(jù)實(shí)際類型做強(qiáng)轉(zhuǎn)。比方說:

lpOutBuff := unsafe.Pointer(C.malloc(1024))

這個1024看實(shí)際情況修改,不是萬能的。

結(jié)構(gòu)體數(shù)組的傳遞

results := (*C.struct_name)(C.malloc(C.size_t(C.sizeof_struct_name * C.int(resLen))))     defer C.free(unsafe.Pointer(results))

struct_name換成具體的結(jié)構(gòu)體名稱,申請了空間要釋放,GO檢測不到C的部分。

結(jié)構(gòu)體數(shù)組遍歷獲取元素數(shù)據(jù)

    for i := 0; i < int(resLen); i++ {         result := (*C.struct_name)(unsafe.Pointer(uintptr(unsafe.Pointer(results)) + uintptr(i*C.sizeof_struct_name)))     }

struct_name換成具體的結(jié)構(gòu)體名稱,uintptr是元素內(nèi)存地址,根據(jù)偏移量獲取元素。go for i := 0; i < int(resLen); i++ { result := (*C.DetectFaceResult)(unsafe.Pointer(uintptr(unsafe.Pointer(results)) + uintptr(i*C.sizeof_DetectFaceResult))) }

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
日韩国产欧美亚洲| 性欧美18一19内谢| www.av91| www插插插无码免费视频网站| 中文字幕1234区| 午夜一区二区视频| 一区二区三区视频网| 美女少妇一区二区| 亚洲午夜激情影院| 欧美激情第四页| 91视频成人免费| 亚洲一区 在线播放| 人妻av无码专区| 大陆极品少妇内射aaaaa| 国产精品无码专区av在线播放| 无码人妻h动漫| 亚州精品一二三区| 深夜做爰性大片蜜桃| 免费人成在线观看视频播放| 成人免费观看cn| 天天干天天玩天天操| 日日噜噜噜夜夜爽爽| 日韩网站在线免费观看| 可以免费观看av毛片| 精品综合久久久久| youjizz.com在线观看| 日韩在线视频在线观看| 极品粉嫩美女露脸啪啪| www.日本在线播放| 久久久久国产一区| a在线视频观看| 人妻无码久久一区二区三区免费| 青青视频免费在线观看| 日本在线xxx| 日本黄大片一区二区三区| 污污视频网站在线| 成人小视频在线观看免费| 国产综合免费视频| 中国黄色录像片| 妓院一钑片免看黄大片| 成人毛片100部免费看| 国产精品人人爽人人爽| 无码粉嫩虎白一线天在线观看| 丰满少妇在线观看| av免费观看国产| 国产卡一卡二在线| 亚洲精品久久久中文字幕| 欧美日韩黄色一级片| 欧美日韩dvd| 一级日本黄色片| 男女视频在线看| 无码人妻丰满熟妇区五十路百度| 少妇大叫太大太粗太爽了a片小说| 成人午夜激情av| 国产性生交xxxxx免费| 鲁一鲁一鲁一鲁一澡| 999久久欧美人妻一区二区| 五月天丁香花婷婷| 999在线观看| 爱爱爱爱免费视频| 国产福利影院在线观看| 日本免费黄视频| www.亚洲天堂网| 日本精品www| 漂亮人妻被中出中文字幕| 国产视频一视频二| 欧美成人一区二区在线观看| 久久久久久久9| 人妻久久久一区二区三区| 国产免费一区二区视频| 国产av人人夜夜澡人人爽麻豆| 男人天堂av片| 久久婷婷五月综合色国产香蕉| 97av视频在线观看| 无码人妻精品一区二区三区66| 韩国中文字幕av| 午夜av中文字幕| 可以免费看的黄色网址| 精品少妇在线视频| 成人免费无码av| 亚洲精品视频三区| 成人短视频在线观看免费| 日韩精品在线中文字幕| 欧美黄色免费影院| 成 人 黄 色 小说网站 s色| 精品国产无码在线| 91九色丨porny丨国产jk| 青青艹视频在线| 91女神在线观看| 999久久欧美人妻一区二区| 怡红院av亚洲一区二区三区h| 麻豆一区二区三区视频| 日本丰满少妇黄大片在线观看| 欧美在线一区视频| 日本超碰在线观看| 福利视频一二区| 日韩欧美国产片| 国产成人无码a区在线观看视频| 国产又黄又猛又粗| www.亚洲成人网| 中文字幕线观看| 久久久久久久久久久久久国产精品 | 国产成人亚洲精品无码h在线 | 色啦啦av综合| 国产人妻777人伦精品hd| 一区二区免费av| 国模无码视频一区二区三区| 在线播放黄色av| 久久久久久香蕉| 99久久国产综合精品五月天喷水| 色噜噜狠狠永久免费| 欧美,日韩,国产在线| 美女黄色片网站| 亚欧激情乱码久久久久久久久| 日本精品久久久久久久久久| 亚洲在线观看网站| 国产九九在线视频| av片中文字幕| 少妇人妻在线视频| 国产一级不卡视频| ijzzijzzij亚洲大全| 亚欧激情乱码久久久久久久久| 欧美亚洲一二三区| 奇米精品一区二区三区| 今天免费高清在线观看国语| 天堂av.com| 在线播放黄色av| 色姑娘综合天天| 成年人三级视频| 强开小嫩苞一区二区三区网站| 日韩精品aaa| 欧美国产在线一区| 在线观看视频黄色| 久久视频免费在线| 国产精品igao激情视频| 欧美视频在线第一页| 免费人成自慰网站| 日韩一级免费看| 黄页网站大全在线观看| 青青青免费在线| 成人一区二区三| 污网站在线免费| 特级西西444www| 在线观看17c| 丁香花在线影院观看在线播放| 国产a级片网站| 看欧美ab黄色大片视频免费 | 最新av在线免费观看| 99中文字幕在线观看| 日本手机在线视频| aaaaaa亚洲| www,av在线| 福利视频一区二区三区四区| 丰满人妻中伦妇伦精品app| 午夜dv内射一区二区| 三级黄色片播放| 欧美亚洲日本一区二区三区| 无遮挡又爽又刺激的视频| 久久久久xxxx| 一二三四视频社区在线| 成人3d动漫一区二区三区| 国产探花在线观看视频| 少妇高潮毛片色欲ava片| 成年网站在线播放| 波多野结衣与黑人| 精品日韩久久久| 丝袜人妻一区二区三区| 男人添女人下面免费视频| 日韩成人三级视频| 色综合手机在线| 91午夜在线观看| 国产a级片免费看| 热久久精品国产| 福利视频一区二区三区四区| 亚洲娇小娇小娇小| 欧洲黄色一级视频| 久久久久久久久影视| 最新天堂中文在线| 精品久久久久久久免费人妻| 欧美xxxx吸乳| 久久出品必属精品| 天天爽夜夜爽一区二区三区| 国产原创popny丨九色| 国产911在线观看| 中文字幕 欧美日韩| 成人免费无码av| 男女午夜激情视频| 青青草精品视频在线| 国产高清精品软男同| 一区二区久久精品| 涩涩网站在线看| 九色porny自拍| 亚洲黄色av网址| 国产精品免费观看久久| 欧美亚洲精品一区二区| 成人性生活视频免费看| 日b视频免费观看| 久久久天堂国产精品| 欧美一区二区三区综合| 一本色道久久88亚洲精品综合|