Как стать автором
Обновить

Комментарии 11

Спойлер: Через FFI.

А есть другой вариант? :))

Думал, может где-то срезаны углы, чтобы сразу в LLVM-совместимое что-то собрать. Чуда не произошло, увы.

Будет время, я копну и в эту сторону.
По-моему самое сложное в этом вопросе это то, что надо разобраться как работает cgo( который по-факту и не С и не Go), тоже самое наверняка и со стороны раста.
Это хороший вопрос, который бы хорошо адресовать разработчикам компиляторов :)) В данном случае вызов происходит через FFI, что достаточно неплохо документировано.
В конкретном случае да, но это легко только пока простыми вещами вроде строк и чисел приходится оперировать. Когда доходит до структур или ссылок, то уже не все так радужно. Тут уже надо садиться и разбираться как это все работает на стыке языков.

самая большая проблема примеров с ffi в том, что они либо слишком сложные, либо, как ваш, не несут никакой практической пользы вообще.


а теперь попробуйте взять этот результат и применить его в своём скрипте на го. то то же.


покажите как вернуть значение в вызывающий код, расскажите как сделать так чтоб раст не удалил это значение при выходе из контекста, как потом почистить за собой память, есть ли возможность вернуть null и т.д.
а пример скопипастить на хабр это не интересно.

Эта статья и не рассматривалась как сложная — на что я и указал в начале.

покажите как вернуть значение в вызывающий код, расскажите как сделать так чтоб раст не удалил это значение при выходе из контекста, как потом почистить за собой память, есть ли возможность вернуть null и т.д.

Будет интерес к статья — я расскажу и об этом.

а пример скопипастить на хабр это не интересно.

Пример кода на Rust взят с книги, и я показал, как его можно использовать из Go. В книге о Go ничего не говорится, что на самом деле является недостатком.
А почему бы не скомпилировать rust библиотеку в static-lib? Насколько помню go прекрасно умеет с ними работать через тот же cgo. Только работать это будет быстрее и соберется все в единый бинарник.

Ну и так на заметку читающим, libembed.dylib — это мак специфично, на линуксе будет libembed.so, а на винде — libembed.dll
А почему бы не скомпилировать rust библиотеку в static-lib? Насколько помню go прекрасно умеет с ними работать через тот же cgo. Только работать это будет быстрее и соберется все в единый бинарник.


В данному случае все также соберется в единый бинарный файл. Будет ли это быстрее, чем static-lib это хороший вопрос и нужно смотреть на уровне ассемблера, как происходит вызов. Ну и опять же — все может зависеть от версии компилятора cgo.

Ну и так на заметку читающим, libembed.dylib — это мак специфично, на линуксе будет libembed.so, а на винде — libembed.dll

Спасибо. Хорошее замечания я добавлю в статью.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории