gpt4 book ai didi

c - 我如何提供对我用 cgo 包装的库的访问?

转载 作者:IT王子 更新时间:2023-10-29 02:17:37 31 4
gpt4 key购买 nike

我正在尝试为 C 库编写绑定(bind),特别是 libnfc .我当前的代码可在 Github 上找到.

libnfc 的核心结构之一是设备。它由 Go 类型 Device 表示。

type Device struct {
d *C.nfc_device
}

Device 上运行的 libnfc 中的所有函数都是它的方法。现在,还有其他 C 库(例如 libfreefare),其 API 在 nfc_devicees 上运行。为了模块化,我想将我包装的每个库的代码放入其自己的模块中。这导致了问题,我无法从其他模块中访问私有(private)结构成员。我想到了以下解决方案:

  • 使 d 成为 Device 的公共(public)成员

    这将使从其他模块中访问底层 nfc_device 变得容易,但它也使得回避类型安全变得容易。另外,我不知道 cgo 是否能识别来自不同模块的指向外部类型的指针。最后,如果更改设备类型的结构,我将失去灵 active 。

  • 添加访问器func (Device) GetCPtr() unsafe.Pointer

    这解决了上述问题,但引入了一个新问题,即您突然可以访问模块中的 unsafe.Pointer,而该模块甚至可能不会导入 unsafe

  • 添加访问器func (Device) GetCPtr() uintptr

    这解决了上述问题,因为您必须手动转换结果以获得正确的指针。

有什么我错过的方法吗?是否有更好、更惯用的方式来提供对底层 nfc_device 的访问?

最佳答案

我总体上赞成你的第三个提议,因为这是 reflect package handles this issue 的方式.

你还可以做的是在你的 libnfc 包装器中只公开一个接口(interface),例如

type NFCDevice interface {
Read() ([]byte, error)
Write() ([]byte, error)
// ...
}

现在您拥有一个安全的公共(public) API。

此外,您的device 类型实现了一个功能

func (d *device) NfcDevice() *C.nfc_device {
return d.nfc_device
}

您可以通过声明您的 NFCDevice 来在您的其他包装器中使用它来实现界面

interface {
NfcDevice() *C.nfc_device
}

您可以在其他包装器中即时创建。这样程序员就得故意做一些事情来访问您的设备的内部工作。

关于c - 我如何提供对我用 cgo 包装的库的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21653547/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com