Невозможно отправить срез строки 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 для использования в скрипте.