有没有一些教程或实践经验教训如何编写一个扩展的Ruby在Go?
Go 1.5增加了对构建可从C调用的共享库(从而通过FFI从Ruby调用)的支持。这使得该过程比在1.5之前的版本(当需要编写C粘合层时)更容易,并且Go运行时现在可用,使得这在实际中是有用的(goroutine和内存分配在之前是不可能的,因为他们需要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
注意,//导出GoAdd注释是每个导出函数所必需的;导出后的符号将如何导出函数。
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