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