
本文介绍了如何利用 Go 语言为 Ruby 创建扩展,核心在于 Go 1.5 及更高版本对构建共享库的支持,使得 Ruby 可以通过 FFI (Foreign Function Interface) 直接调用 Go 代码。
使用 Go 构建共享库
从 Go 1.5 开始,Go 语言支持构建可以被 C 语言调用的共享库。这意味着我们可以用 Go 编写高性能的函数,然后将其暴露给 Ruby 使用,而无需编写额外的 C 语言粘合层。这极大地简化了为 Ruby 编写扩展的过程。
示例:创建一个简单的加法函数
下面是一个简单的示例,展示了如何创建一个将两个整数相加的 Go 函数,并将其编译为共享库,然后在 Ruby 中调用它。
首先,创建一个名为 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 的 Go 函数,它接受两个 C 语言风格的整数作为参数,并返回它们的和。//export GoAdd 注释是必需的,它告诉 Go 编译器将 GoAdd 函数导出为共享库的符号。main 函数是必需的,但会被忽略。
将 Go 代码编译为共享库
使用以下命令将 Go 代码编译为共享库:
go build -buildmode=c-shared -o goFuncs.so goFuncs.go
这个命令会生成一个名为 goFuncs.so 的共享库文件。-buildmode=c-shared 选项告诉 Go 编译器构建一个可以被 C 语言调用的共享库。-o goFuncs.so 选项指定输出文件的名称。
主要特点:1、支持一站多语言(即可以语言切换,默认支持中文简体,繁体,英文,日文),无限种语言扩展2、用户可以任意修改模板(注:{abcd} 类似的标签不能修改) 主要功能:1、产品发布 1.1 产品类别管理 (支持无限级分类,采用树形菜单管理模板) 1.2 产品添加 (支持HTML编辑功能) 1.3 产品管理 (支持产品批量处理品 [删除,发布,取消发布,推荐,取消推荐]) 2、文章
在 Ruby 中调用 Go 函数
创建一个名为 goFromRuby.rb 的 Ruby 文件,包含以下代码:
require 'ffi' module GoFuncs extend FFI::Library ffi_lib './goFuncs.so' attach_function :GoAdd, [:int, :int], :int end puts GoFuncs.GoAdd(41, 1)
这段代码使用 FFI 库来加载共享库,并将 GoAdd 函数绑定到 Ruby 代码中。ffi_lib './goFuncs.so' 告诉 FFI 库加载 goFuncs.so 文件。attach_function :GoAdd, [:int, :int], :int 将 GoAdd 函数绑定到 Ruby 代码中,并指定它的参数类型和返回类型。
运行 Ruby 脚本
运行 Ruby 脚本:
ruby goFromRuby.rb
输出结果应该是:
42
注意事项
- 确保安装了 FFI 库。可以使用 gem install ffi 命令安装它。
- //export 注释是必需的,它告诉 Go 编译器将函数导出为共享库的符号。
- Go 函数的参数和返回类型必须是 C 语言兼容的类型。
- main 函数是必需的,但会被忽略。
- 在编译 Go 代码时,需要使用 -buildmode=c-shared 选项。
总结
使用 Go 语言为 Ruby 编写扩展非常简单,并且可以利用 Go 的高性能和并发性。通过 FFI,我们可以轻松地将 Go 代码集成到 Ruby 应用程序中,而无需编写额外的 C 语言粘合层。这使得我们可以用 Go 编写高性能的组件,然后将其作为 Ruby 扩展使用,从而提高 Ruby 应用程序的性能。









