一尘不染

在Go(golang)中编写Ruby扩展

go

是否有一些有关如何在Go中编写Ruby扩展的教程或实践课程?


阅读 281

收藏
2020-07-02

共1个答案

一尘不染

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

请注意,//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
2020-07-02