如何使用 CGO 将字符串从函数返回到 Ruby

我在 Go 中有一个函数:


func login(user *C.char) *C.char {

    cstr := C.CString("Hello World")

    defer C.free(unsafe.Pointer(cstr))

    return cstr 

}

我的红宝石代码如下


module GoLib

  extend FFI::Library

  ffi_lib './golib.so'


  attach_function :login, [:string], :string

end


GoLib.login("User1") #=> "p\x9A\xA0\xDB\x16V"

它不会作为红宝石字符串返回。我该如何解决这个问题?


手掌心
浏览 75回答 1
1回答

呼唤远方

如评论中所述,cstr在将控制权传递给 Ruby 后获得自由。这是一个解决方法,您可以在 Ruby 中显式管理指针。package main// #include <stdlib.h>import "C"import "unsafe"//export loginfunc login(user *C.char) *C.char {&nbsp; &nbsp; return C.CString("Hello from Go")}//export logoutfunc logout(c *C.char) {&nbsp; &nbsp; C.free(unsafe.Pointer(c))}func main() {}在红宝石中:require 'ffi'module GoLib&nbsp; extend FFI::Library&nbsp; ffi_lib './so.so'&nbsp; attach_function :login, [:string], :strptr&nbsp; attach_function :logout, [:pointer], :voidends, p = GoLib.login("User1")puts sp = FFI::AutoPointer.new(p, GoLib.method(:logout))请注意此处strptr演示的使用
打开App,查看更多内容
随时随地看视频慕课网APP