我希望能够使用一个切片的引用,从Go语言中调用一些用Rust编写的外部函数。
我有以下的Rust代码:
extern crate libc;
#[no_mangle]
pub extern "C" fn callme(data: &mut [libc::c_double]) -> i32 {
data.len() as i32
}
该函数可通过此C风格头文件为cgo编译器提供。
#IFNDEF BOGUSLIB_H
#DEFINE BOGUSLIB_H
extern int callme(double* data);
#ENDIF
我现在可以通过将Rust crate编译为cdylib,从Go中调用此函数:
//#cgo CFLAGS: -Ipath/to/libfolder
//#cgo LDFLAGS: -Lpath/to/libfolder -lboguslib
//#include <boguslib.h>
import "C"
import (
"unsafe"
. "fmt"
)
func CallmeExternal() {
data := make([]float64, 1, 1)
data[0] = 1.0
ptr := (*C.double)(unsafe.Pointer(&data[0]))
size := C.callme(ptr)
printf("size %v",size)
}
Go代码使用unsafe指针技巧来访问后备数组,因为切片的定义如下:
type Slice struct {
data *byte
uint32 len
uint32 cap
}
当我执行以上代码时,传递的引用长度非常大。我该如何访问实际数据,此时返回的是什么?
&mut [...]
不是这样的类型。你是否查看了 FFI Omnibus? - Matthieu M.