Невозможно передать go go обратно в расширение ruby ​​ffi - PullRequest
0 голосов
/ 01 октября 2019

Невозможно отправить срез строки golang в cgo, чтобы отодвинуть назад моего вызывающего абонента расширения FFI.

Я пытался использовать golang unsafe.Pointer, чтобы отодвинуть его назад, затем я получаю сообщение об ошибке "cgoрезультат имеет указатель Go ".

GO LANG CODE ::

package main

//#include <stdio.h>
//#include <stdlib.h>
import "C"
import (
    "encoding/csv"
    "fmt"
    "log"
    "os"
    "unsafe"
)

//export prnt
func prnt(data *C.char) {
    println(C.GoString(data))
}

//export csvReader
func csvReader(csvPath *C.char) unsafe.Pointer {
    csvIn, err := os.Open(C.GoString(csvPath))
    if err != nil {
        log.Fatal(err)
    }
    r := csv.NewReader(csvIn)
    lines, err := r.ReadAll()
    if err != nil {
        fmt.Println(err)
    }
    total := len(lines)

    defer csvIn.Close()
    var data []string
    var row int
    for _, line := range lines {
        row++
        fmt.Println(row)
        data = append(data, line...)
    }

    defer C.free(unsafe.Pointer(&data))
    return data
}

func main() {}

МОДУЛЬ РАСШИРЕНИЯ РУБИНА ::

require 'ffi'

module Gonnect
  extend FFI::Library
  ffi_lib './gonnect.so'
  attach_function :csvReader, [:string], :pointer
  attach_function :prnt, [:string], :void
end
raw_data = Gonnect.csvReader("utils/testcsv.csv")

puts "RAW DATA::: #{raw_data}"

Я ожидаю, что Голанг вернет данные к моемуРасширение модуля скрипта ruby ​​для использования в скрипте.

...