为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
手掌心 2023-05-15 14:31:48
我在 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], :stringendGoLib.login("User1") #=> "p\x9A\xA0\xDB\x16V"它不会作为红宝石字符串返回。我该如何解决这个问题?
查看完整描述

1 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

如评论中所述,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() {}

在红宝石中:


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演示的使用



查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信