为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
凤凰求蛊 2021-08-16 18:37:55
我正在尝试使用 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?
查看完整描述

1 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

简短的回答是,如果不修改go-opencv. 这里有一些障碍:

  1. 导入包时,只能使用已导出的标识符。在这种情况下,data不以大写字母开头,因此不会导出。

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

  3. 最后,强烈建议不要cgo从包中公开类型。因此,即使在这种可以直接访问底层 C 结构的情况下,我也建议不要这样做。

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


查看完整回答
反对 回复 2021-08-16
  • 1 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信