如何使用切片作为参数从Go调用Rust函数?
我想从Go调用一些用Rust编写的外部函数,并引用一个切片 我有以下防锈代码:如何使用切片作为参数从Go调用Rust函数?,go,rust,ffi,Go,Rust,Ffi,我想从Go调用一些用Rust编写的外部函数,并引用一个切片 我有以下防锈代码: extern板条箱libc; #[没有损坏] pub extern“C”fn callme(数据:&mut[libc::C_double])->i32{ data.len()作为i32 } 此函数可通过以下C样式头文件供cgo编译器使用: #IFNDEF BOGUSLIB#H #定义BOGUSLIB_H 外部调用(双*数据); #恩迪夫 我现在可以从编译为cdylib的Rust板条箱调用此函数: cgo CFLA
extern板条箱libc;
#[没有损坏]
pub extern“C”fn callme(数据:&mut[libc::C_double])->i32{
data.len()作为i32
}
此函数可通过以下C样式头文件供cgo编译器使用:
#IFNDEF BOGUSLIB#H
#定义BOGUSLIB_H
外部调用(双*数据);
#恩迪夫
我现在可以从编译为cdylib的Rust板条箱调用此函数:
cgo CFLAGS:-Ipath/to/libfolder
//#cgo LDFLAGS:-Lpath/to/libfolder-lboguslib
//#包括
输入“C”
进口(
“不安全”
“fmt”
)
func CallmeExternal(){
数据:=make([]浮点64,1,1)
数据[0]=1.0
ptr:=(*C.double)(不安全的指针和数据[0]))
尺寸:=C.callme(ptr)
printf(“尺寸%v”,尺寸)
}
Go代码使用不安全的指针技巧访问备份数组,因为切片定义如下
类型切片结构{
数据*字节
uint32透镜
uint32盖
}
当我执行上面的代码时,传递的引用的长度非常大。如何访问实际数据,以及此时返回的是什么?根据as,我已成功地重写了代码。函数签名必须接受目标语言理解的类型
防锈功能签名更改为:
#[无损坏]
pub extern“C”fn callme(切片:*常量libc::C_double,len:libc::size_t)->libc::C_int{
让数据=切片::来自原始零件(切片,透镜为usize);
data.len()作为i32
}
头文件中的声明如下所示:
//跳过包含防护装置
#包括
外部内部调用(双*片,大小为透镜);
Go的电话现在也变了
func CallmeExternal(){
数据:=make([]浮点64,2,2)
数据[0]=1.0
ptr:=(*C.double)(不安全的指针和数据[0]))
len:=C.size\u t(len(数据))
尺寸:=C.callme(ptr,len)
printf(“尺寸%v”,尺寸)
}
这将返回
2
在FFI接口中,您确实希望使用目标语言能够理解的类型。在这里,&mut[…]
不是。你查过了吗?太好了!谢谢你的链接。