Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用切片作为参数从Go调用Rust函数?_Go_Rust_Ffi - Fatal编程技术网

如何使用切片作为参数从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

我想从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 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[…]
不是。你查过了吗?太好了!谢谢你的链接。