猿问

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

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


typedef struct CvMat

{

    ...

    union

    {

        uchar* ptr;

        short* s;

    } data;

}

我正在使用此处找到的 opencv 绑定。这有一个类型别名CvMat:


type Mat C.CvMat

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


...

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

...

所以上面有一个data字段,但它甚至不是同一种类型。这是一个 8uint8秒的数组!我正在寻找一个uchar*比 8 个字符长得多的字符。我如何才能做到这一点uchar?


凤凰求蛊
浏览 174回答 1
1回答

芜湖不芜

简短的回答是,如果不修改go-opencv. 这里有一些障碍:导入包时,只能使用已导出的标识符。在这种情况下,data不以大写字母开头,因此不会导出。即使它是一个导出的标识符,你也会遇到麻烦,因为 Go 不支持联合。因此,该字段由一个字节数组表示,该数组与底层 C 联合的大小相匹配(在本例中为 8 个字节,与 64 位指针的大小相匹配)。最后,强烈建议不要cgo从包中公开类型。因此,即使在这种可以直接访问底层 C 结构的情况下,我也建议不要这样做。理想情况下go-opencv会为您所追求的信息提供一个访问器(大概是一个可以检查联合的哪个分支正在使用的访问器,而不是默默地返回错误数据。我建议您要么在包上提交错误报告(可能带有补丁) ),或者如果您立即需要该功能,则创建带有所需修改的私人副本。
随时随地看视频慕课网APP

相关分类

Go
我要回答