Я пытаюсь написать привязки для библиотеки C, в частности, libnfc. Мой текущий код доступен по адресу Github.Как предоставить доступ к библиотеке, которую я обернуваю с помощью cgo?
Одной из центральных структур в libnfc является устройство. Он представлен типом Go Device
.
type Device struct {
d *C.nfc_device
}
Все функции внутри libnfc, которые работают на Device
методы этого. Теперь существуют другие библиотеки C (например, libfreefare), API которых работает на nfc_device
. Для модульности я хочу поместить код для каждой библиотеки, которую я переношу в свой собственный модуль. Это приводит к проблеме, что я не могу получить доступ к членам частной структуры из других модулей. Я думал о следующих решениях:
Сделать
d
общественного членDevice
Это сделало бы легко получить доступ к лежащим в основе
nfc_device
из других модулей, но это делает его также легко обойти типобезопасность , Кроме того, я не знаю, признает ли cgo указатели на иностранные типы, если они поступают из разных модулей. Наконец, я теряю гибкость, если меняю структуру типа устройства.Добавить аксессор
func (Device) GetCPtr() unsafe.Pointer
Это решает проблемы выше, но вводит новый вопрос, который вы suddently иметь доступ к
unsafe.Pointer
в модуле, который не может даже импортироватьunsafe
.Добавить аксессор
func (Device) GetCPtr() uintptr
Это решает вышеупомянутую проблему, как вы должны вручную привести результат, чтобы получить правильный указатель.
Есть ли способы пропустить? Есть ли лучший, более идиоматический способ обеспечения доступа к базовому nfc_device
?
спасибо. Я решил реализовать его таким образом. – fuz