登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-11 20:18:32 485浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《如何使用 CGO 将字符串从函数返回到 Ruby》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我在 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() {}

在红宝石中:

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 所示

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何使用 CGO 将字符串从函数返回到 Ruby》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>