在Go中访问原始C结构上的字段

时间:2014-09-15 04:44:11

标签: opencv go

我正在尝试使用Go中的OpenCV。 OpenCV定义了一个具有CvMat字段的结构data

typedef struct CvMat
{
    ...
    union
    {
        uchar* ptr;
        short* s;
    } data;
}

我正在使用opencv找到here的go绑定。这有CvMat的类型别名:

type Mat C.CvMat

现在我有一个Mat对象,我想访问它上面的data字段。我怎样才能做到这一点?如果我尝试访问_data,则无效。我使用Mat包打印了reflect对象上的字段,并得到了这个:

...
{data github.com/lazywei/go-opencv/opencv [8]uint8  24 [5] false}
...

因此它上面有一个data字段,但它甚至不是同一类型。这是一个8 uint8的数组!我正在寻找一个超过8个字符的uchar*。我如何进入uchar

1 个答案:

答案 0 :(得分:3)

简短的回答是,如果不修改go-opencv,就无法做到这一点。这里有一些障碍:

  1. 导入包时,you can only use identifiers that have been exported。在这种情况下,data不以大写字母开头,因此不会导出。

  2. 即使它是导出的标识符,您也会遇到麻烦,因为Go不支持联合。因此,该字段由一个字节数组表示,该字节数组与底层C联合的大小相匹配(在这种情况下为8字节,与64位指针的大小相匹配)。

  3. 最后,it is strongly recommended not to expose cgo types from packages。因此,即使在这样的情况下,可以直接访问底层的C结构,我也会建议不要使用它。

  4. 理想情况下,go-opencv会为您提供的信息提供一个访问器(可能是一个可以检查联盟的哪个分支正在使用的访问者,而不是默默地返回错误数据。我建议您提交错误报告在包装上(可能带有补丁),或者如果您需要该功能,请创建一个包含所需修改的私人副本。