如何使用 CGO return 从函数到 Ruby 的字符串
How to return string from function to Ruby with CGO
我在 Go 中有一个函数:
func login(user *C.char) *C.char {
cstr := C.CString("Hello World")
defer C.free(unsafe.Pointer(cstr))
return cstr
}
我的ruby代码如下
module GoLib
extend FFI::Library
ffi_lib './golib.so'
attach_function :login, [:string], :string
end
GoLib.login("User1") #=> "p\x9A\xA0\xDB\x16V"
它不像 return 作为 ruby 字符串。我该如何解决这个问题?
如评论中所述,cstr
在控制权移交给 Ruby 后获得释放。这是一个解决方法,您可以在 Ruby.
中显式管理指针
package main
// #include <stdlib.h>
import "C"
import "unsafe"
//export login
func login(user *C.char) *C.char {
return C.CString("Hello from Go")
}
//export logout
func logout(c *C.char) {
C.free(unsafe.Pointer(c))
}
func main() {}
在Ruby中:
require 'ffi'
module GoLib
extend FFI::Library
ffi_lib './so.so'
attach_function :login, [:string], :strptr
attach_function :logout, [:pointer], :void
end
s, p = GoLib.login("User1")
puts s
p = FFI::AutoPointer.new(p, GoLib.method(:logout))
注意 strptr
的用法,如 here
所示
我在 Go 中有一个函数:
func login(user *C.char) *C.char {
cstr := C.CString("Hello World")
defer C.free(unsafe.Pointer(cstr))
return cstr
}
我的ruby代码如下
module GoLib
extend FFI::Library
ffi_lib './golib.so'
attach_function :login, [:string], :string
end
GoLib.login("User1") #=> "p\x9A\xA0\xDB\x16V"
它不像 return 作为 ruby 字符串。我该如何解决这个问题?
如评论中所述,cstr
在控制权移交给 Ruby 后获得释放。这是一个解决方法,您可以在 Ruby.
package main
// #include <stdlib.h>
import "C"
import "unsafe"
//export login
func login(user *C.char) *C.char {
return C.CString("Hello from Go")
}
//export logout
func logout(c *C.char) {
C.free(unsafe.Pointer(c))
}
func main() {}
在Ruby中:
require 'ffi'
module GoLib
extend FFI::Library
ffi_lib './so.so'
attach_function :login, [:string], :strptr
attach_function :logout, [:pointer], :void
end
s, p = GoLib.login("User1")
puts s
p = FFI::AutoPointer.new(p, GoLib.method(:logout))
注意 strptr
的用法,如 here