我正在尝试为 C 库编写绑定,特别是libnfc。我当前的代码在Github上可用。
libnfc 中的核心结构之一是设备。它由 Go 类型表示Device
。
type Device struct {
d *C.nfc_device
}
libnfc 中所有对 a 进行操作的函数Device
都是它的方法。现在,还有其他 C 库(例如 libfreefare),其 API 在nfc_device
es 上运行。为了模块化,我想将我包装的每个库的代码放入它自己的模块中。这导致了问题,即我无法从其他模块中访问私有结构成员。我想到了以下解决方案:
成为
d
公共成员Device
这将使
nfc_device
从其他模块中访问底层变得容易,但它也使得回避类型安全也变得容易。此外,如果 cgo 来自不同的模块,我不知道是否可以识别指向外部类型的指针。最后,如果我更改 Device 类型的结构,我将失去灵活性。添加访问器
func (Device) GetCPtr() unsafe.Pointer
这解决了上述问题,但引入了一个新问题,即您突然可以访问一个
unsafe.Pointer
甚至可能无法导入的模块中的一个unsafe
。添加访问器
func (Device) GetCPtr() uintptr
这解决了上述问题,因为您必须手动转换结果才能获得正确的指针。
有什么我错过的方法吗?是否有更好、更惯用的方式来提供对底层的访问nfc_device
?