Go で Ruby の拡張機能を作成する方法に関するチュートリアルや実践的なレッスンはありますか?
3 に答える
Go 1.5 では、C から (したがって FFI を介して Ruby から) 呼び出し可能な共有ライブラリを構築するためのサポートが追加されました。これにより、1.5 より前のリリース (C グルー レイヤーを記述する必要があったとき) よりもプロセスが簡単になり、Go ランタイムが使用できるようになり、実際にこれが実際に役立つようになりました (ゴルーチンとメモリ割り当ては以前は不可能でした。 Go ランタイムが必要ですが、Go がメインのエントリ ポイントでない場合は使用できませんでした)。
goFuncs.go:
package main
import "C"
//export GoAdd
func GoAdd(a, b C.int) C.int {
return a + b
}
func main() {} // Required but ignored
//export GoAdd
エクスポートされた関数ごとにコメントが必要であることに注意してください。後の記号export
は、関数のエクスポート方法です。
goFromRuby.rb:
require 'ffi'
module GoFuncs
extend FFI::Library
ffi_lib './goFuncs.so'
attach_function :GoAdd, [:int, :int], :int
end
puts GoFuncs.GoAdd(41, 1)
ライブラリは次のもので構築されています。
go build -buildmode=c-shared -o goFuncs.so goFuncs.go
Ruby スクリプトを実行すると、以下が生成されます。
42
Go 1.5 の時点で、共有ライブラリと C ヘッダー ファイルを出力するように Go コンパイラに指示する新しいビルド モードがあります。
-buildmode c-shared
(これについては、この役立つチュートリアルで詳しく説明しています: http://blog.ralch.com/tutorial/golang-sharing-libraries/ )
新しいビルド モードでは、C グルー レイヤーを自分で作成する必要がなくなりました (以前の回答で提案されていたように)。共有ライブラリとヘッダー ファイルを取得したら、FFI を使用して Go で作成された共有ライブラリを呼び出すことができます (例: https://www.amberbit.com/blog/2014/6/12/calling- c-cpp-from-ruby/ )