golangのcgo---タイプ変換小試牛刀のC構造体とgo構造体変換

3693 ワード

前の記事ではgo C (http://blog.csdn.net/freeape/article/details/51885308)ですが、実際のプロジェクトでは基本タイプ間の変換だけでなく、関数パッケージでの値伝達やポインタ伝達が多く使われていますが、C機能関数やGoではどのようにして様々な値やポインタ伝達を行うのでしょうか.根本的な方法はやはり基本的なタイプを利用して、特によく使われるunsafe.Pointerを含む.
まず例を見てみましょう.
package main

/*
#include 
#include 
#include 
#include 

#define MAX_FACES_PER_DETECT 64

typedef  struct Point{
    float x;
    float y;
}Point;

typedef struct Rectangle{
    Point lt;
    Point rd;
}Rectangle;

typedef struct DetectFaceInfo{
    int id;
    float score;
    Rectangle pos;
}DetectFaceInfo;



void setStruct(void **ppDetectInfo)
{
    DetectFaceInfo *pDetectInfo = (DetectFaceInfo *)malloc(sizeof(DetectFaceInfo));
    memset(pDetectInfo, 0 , sizeof(pDetectInfo));
    pDetectInfo->id = 1;
    pDetectInfo->score = 0.98f;
    pDetectInfo->pos.lt.x = 1;
    pDetectInfo->pos.lt.y = 1;
    pDetectInfo->pos.rd.x = 9;
    pDetectInfo->pos.rd.y = 10;

    fprintf(stdout, "A pDetectInfo address : %p
", pDetectInfo); *ppDetectInfo = pDetectInfo; } int printStruct(void *pdetectinfo) { DetectFaceInfo * pDetectInfo = (DetectFaceInfo *)pdetectinfo; fprintf(stdout, "B pDetectInfo address : %p
", pDetectInfo); fprintf(stdout, "id: %d
", pDetectInfo->id); fprintf(stdout, "score : %.3lf
", pDetectInfo->score); fprintf(stdout, "pos.lt.x : %d
", pDetectInfo->pos.lt.x); fprintf(stdout, "pos.lt.y : %d
", pDetectInfo->pos.lt.y); fprintf(stdout, "pos.rd.x : %d
", pDetectInfo->pos.rd.x); fprintf(stdout, "pos.rd.y : %d
", pDetectInfo->pos.rd.y); } int freeStruct(void *pDetectInfo) { fprintf(stdout, "C pDetectInfo address : %p
", pDetectInfo); free((DetectFaceInfo*)pDetectInfo); } */
import "C" import ( _ "fmt" _ "reflect" "unsafe" ) func main() { var pDetectInfo unsafe.Pointer C.setStruct(&pDetectInfo) C.printStruct(pDetectInfo) C.freeStruct(pDetectInfo) }

上の例から,Cとgoの基本タイプ変換を利用したか,ポインタを利用したかが分かる.実行結果は次のとおりです.
A pDetectInfo address : 012832B0
B pDetectInfo address : 012832B0
id: 1
score : 0.980
pos.lt.x : 1.000
pos.lt.y : 1.000
pos.rd.x : 9.000
pos.rd.y : 10.000
C pDetectInfo address : 012832B0

  これはCの構造体を介してgoにデータを転送し、同様にgoでデータを処理してCに渡すこともでき、基本タイプ変換を利用することもできる.ここで記録します.
  • Cの構造体にtypedefが付いている場合、goでCの構造体を定義するにはstructは必要ありません.逆は逆.
  • Goで定義C構造体:var struct C.DetectFaceInfo
  • 再度注意、構造体に文字配列またはcharポインタがある場合、注意区別