Go で Ruby の拡張機能を作成する方法に関するチュートリアルや実践的なレッスンはありますか?
ベストアンサー1
Go 1.5 では、C から (つまり、FFI 経由で Ruby から) 呼び出し可能な共有ライブラリの構築のサポートが追加されました。これにより、1.5 より前のリリース (C グルー レイヤーを記述する必要があった) よりもプロセスが簡単になり、Go ランタイムが使用できるようになったため、実際に実生活で役立ちます (Go がメイン エントリ ポイントでない場合、Go ランタイムが必要なため、以前は goroutine とメモリ割り当ては不可能でした)。
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
関数がどのようにエクスポートされるかを示します。
: ...
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