gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:31:11 25 4
gpt4 key购买 nike

我在 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"

它不会作为 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 所示

关于ruby - 如何使用 CGO 将字符串从函数返回到 Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53608352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com