有关于如何在Go中为Ruby编写扩展的教程或实践课程吗?

推荐答案

Go 1.5增加了对构建可从C调用的共享库的支持(因此可以通过FFI从Ruby调用).这使得这个过程比1.5版本之前的版本更容易(当时需要编写C粘合层),Go运行时现在可用,这使得它在现实生活中实际有用(goroutines和内存分配以前是不可能的,因为它们需要Go运行时,如果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后面的符号表示函数的导出方式.

戈弗鲁比.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

Ruby相关问答推荐

带有虾Ruby 的动态标题

Ruby符号前面的-是什么意思?

什么是 '?-mix' 在 Ruby 正则表达式中

rbenv 没有显示可用的 ruby​​ 版本

Ruby 中是否有像 C 中一样的主要方法?

根据另一个数组的元素对数组进行排序

Ruby 中的 Object 和 BasicObject 有什么区别?

如何从最后一个元素开始遍历数组?

如何引用全局变量和类变量?

ActionController::UnknownFormat

如何仅从 Gemfile 中查看依赖关系树?

Ruby:module、require和include

我们什么时候在 Rails 中使用 "||=" 运算符?它的意义是什么?

如何转换 Ruby 哈希,使其所有键都是符号?

if语句末尾带有then有什么区别?

如何在 Ruby 中向异常消息中添加信息?

判断整数是否在范围内

给定一组参数,如何将这些参数发送到 Ruby 中的特定函数?

我更改存储库 URL 后 Capistrano 部署失败

如何在 Ruby 中实现回调?