Go 调用Rust函数

news2024/9/23 17:52:40

Go 调用Rust函数

在golang 中,go可以引用c代码,和c共舞,也就是cgo.在一些包里就能看到cgo的身影,gopcap(引用了libpcap),go-sqlite(引用了libsqlite).毕竟c是"万物之主"嘛.本文利用cgo实现go调rust函数

这是一个rust demo用于生成动态连接库for c

lib.rs 中的demo代码

#[no_mangle]
pub extern "C" fn say_hello(name:* const i8,age:std::ffi::c_int){
  let rname=unsafe{
    let realname=std::ffi::CStr::from_ptr(name);
    realname.to_str().expect("to string failed")
  };
  println!("hello {rname} your age is {age}");
}

cargo toml 添加此项生成动态库和静态库 for c.也可以二选一,没必要两个都编

[lib]
crate-type=["cdylib","staticlib"]

编译好后,只要引用了这个库就可以使用say_hello函数了.
go中引用say_hello代码

package main
//#cgo LDFLAGS: -L/Users/oswaldo/dev/rs/ffi/target/release -lffi
//extern void say_hello(const char*,int);
import "C"

func main(){
	C.say_hello(C.CString("jim"),C.int(210))
}

运行看看效果

请添加图片描述

传个结构体交流交流

Go

package main

//#cgo LDFLAGS: -L/Users/oswaldo/dev/rs/ffi/target/release -lffi
//#include <stdint.h>
//struct Student{uint8_t Age;uint8_t Score;uint16_t ID;};
//extern void say_hello(const char*,int);
//extern void get_student_info(struct Student*info);
import "C"

type Student struct {
	Age   uint8
	Score uint8
	ID    uint16
}

func main() {
	C.say_hello(C.CString("jim"), C.int(210))
	var student = C.struct_Student{
		Age:   22,
		Score: 90,
		ID:    0x0111,
	}
	C.get_student_info(&student)
}

Rust
#[repr(C)]是灵魂,不然以rust的方式对齐,和c是错位的。这个宏告诉编译器这个结构体以c的方式对齐。go结构体内存对齐方式和c一致(这也是为什么在go中无论是调某些syscall,还是我自己写的c库,我敢放心大胆的把go中结构体指针直接传过去,只要我内存构造和c中一致就不会出问题)

#[no_mangle]
pub extern "C" fn say_hello(name: *const i8, age: std::ffi::c_int) {
    let rname = unsafe {
        let realname = std::ffi::CStr::from_ptr(name);
        realname.to_str().expect("to string failed")
    };
    println!("hello {rname} your age is {age}");
}
/// repr(C)是灵魂,不然以rust的方式对齐,和c是错位的。这个宏告诉编译器这个结构体以c的方式对齐。go结构体内存对齐方式和c一致
#[repr(C)]
pub struct Student {
    pub age: u8,
    pub score: u8,
    pub id: u16,
}
#[no_mangle]
pub extern "C" fn get_student_info(student: *mut Student) {
    unsafe {
        let stu = student.as_ref().unwrap();
        let level=match stu.score {
            0 ..= 20 =>"C",
            21..=70=>"B",
            _=>"A"
        };
        println!("id: {},score: {}, age: {}, level {level}", stu.id, stu.score, stu.age);
    }
}

运行看看效果

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2074080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Docker】Docker学习03 | Docker的volume

本文首发于 ❄️慕雪的寒舍 1. 引入 在docker的基本知识讲解中&#xff0c;提到了docker镜像是由一层一层文件系统构成的。这一系列文件系统是一系列的只读层。当我们创建一个容器的时候&#xff0c;Docker会读取镜像&#xff08;只读&#xff09;&#xff0c;并在镜像的顶部再…

SpringBoot集成google登陆快速入门Demo

1.为何要使用 Google 账号登录 借助“使用 Google 账号登录”功能&#xff0c;您可通过安全性备受信赖的 Google 账号&#xff0c;轻松快捷地在网上登录和注册网站与应用。该功能可消除您对密码的依赖&#xff0c;从而降低使用密码带来的困扰和安全风险。 2.环境准备 登录 G…

【IEEE出版】第八届电气、机械与计算机工程国际学术会议(ICEMCE 2024,10月25-27)

由西京学院主办&#xff0c;AEIC学术交流中心协办&#xff0c;中国科学技术大学、深圳大学、浙江工业大学等校联合支持的第八届电气、机械与计算机工程国际学术会议&#xff08;ICEMCE 2024&#xff09;将于2024年10月25日至27日在西安举办。 本次会议主要围绕“电气”、"…

【文档】软件项目售后服务标准文档参考(word原件)

软件售后服务方案的售后服务范围广泛&#xff0c;涵盖了多个方面&#xff0c;以确保客户在使用软件过程中得到全面、及时的支持。具体来说&#xff0c;这些服务范围通常包括以下几个核心内容&#xff1a; 技术支持服务维护与更新服务培训与教育服务定制化服务数据管理与服务客户…

[C语言]一、C语言基础(函数)

G:\Cpp\C语言精讲 6. 函数 6.1函数的基本使用 6.1.1 为什么需要函数 《街霸》游戏中&#xff0c;每次人物出拳、出脚或跳跃等动作都需要编写50-80行的代码&#xff0c;在每次出拳、出脚或跳跃的地方都需要重复地编写这50-80行代码&#xff0c;这样程序会变得很臃肿&#xff…

[学习笔记]深度学习详解-Datawhale学习组

第三章&#xff1a;深度学习基础 3.1 局部极小值与鞍点 3.1.1 临界点及其种类 优化神经网络时&#xff0c;使用梯度下降法&#xff0c;遇到梯度为0的点&#xff0c;训练就停了下来&#xff0c;损失也不再下降。 这个梯度为0的点&#xff0c;可以称为临界点。 临界点可以细分…

在挫折感中遇见更好的自己

你是如何克服编程学习中的挫折感的&#xff1f; 编程学习之路上&#xff0c;挫折感就像一道道难以逾越的高墙&#xff0c;让许多人望而却步。然而&#xff0c;真正的编程高手都曾在这条路上跌倒过、迷茫过&#xff0c;却最终找到了突破的方法。你是如何在Bug的迷宫中找到出口的…

ssrf+redisssrf+fastcgi

curl支持很多协议&#xff0c;有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDA ssrfredis dict被禁用了用&#xff08;?urlhttp://172.19.0.3端口&#xff09;来探测一下端口吧 172.19.0.3主机只开放一个80端口 看看内网还有其他服务器没 这里可以看到内网还有…

Ai+若依(代码生成 -- 树表“有层级关系的”):【03篇】

代码生成 代码生成器,根据数据库表结构自动生成前后端CRUD代码提供三种生成模板:单表、树表、主子表(一对多)现在来说说树表,主子表 树表: 例如:公司==》部门==》员工 层级关系的这种 主子表: 例如: 数据之间存在一对多,比如菜品和口味表 一个菜品可以多个口味 自动化…

图形几何算法 -- 判断两条线段是否相交

线段相交检测是计算几何中的一个基本问题&#xff0c;广泛应用于计算机图形学、游戏开发、物理模拟等领域。我们可以通过以下步骤和理论来判断两条线段是否相交。 概念 在二维平面上&#xff0c;给定两条线段 A(P1, P2) 和 B(Q1, Q2)&#xff0c;我们需要判断这两条线段是否相…

鸿蒙内核源码分析(双向链表) | 谁是内核最重要结构体?

答案一定是: LOS_DL_LIST(双向链表)&#xff0c;它长这样. typedef struct LOS_DL_LIST {//双向链表&#xff0c;内核最重要结构体struct LOS_DL_LIST *pstPrev; /**< Current nodes pointer to the previous node *///前驱节点(左手)struct LOS_DL_LIST *pstNext; /**<…

Linux-部署YUM仓库及NFS共享服务

系列文章目录 提示&#xff1a;仅用于个人学习&#xff0c;进行查漏补缺使用。 1.Linux-网络设置 2.Linux-DHCP服务、vsftp 3.Linux-DNS域名解析服务 4.Linux-远程访问及控制 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档…

【GIS系列】多源异构原始影像解析:策略模式与规则引擎的应用

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 1. 前言 在遥感技术和地球观测领域&#…

机器学习周报(8.19-8.25

文章目录 摘要Abstract1.PyTorch环境的配置及安装使用PyCharm配置环境安装配置jupyter 2.两个Python常用函数3.DataSet4.TensorBoard的使用绘制一幅坐标图使用tendorboard对一幅图片进行操作 5.torchvison中的transforms总结 摘要 在之前学习了一些机器学习相关理论之后&#…

【限时免费发放】2000+热门Scratch作品源码

欢迎访问小虎鲸Scratch资源站&#xff01;在Scratch编程的学习过程中&#xff0c;优质的资源和灵感是至关重要的。因此&#xff0c;我们特别准备了这份【免费下载】的Scratch作品源码合集&#xff0c;包含超过2000个精选的Scratch项目源码&#xff0c;旨在为Scratch编程爱好者和…

Nginx+keepalived实现高可用

目录 一、准备工作 1、安装软件 二、配置master主服务器 1、修改nginx主配置文件 ​编辑 2、修改keepalived主配置文件 三、配置backup备服务器 四、配置节点服务器 1、配置第一个节点服务器 1.1、设置虚拟网卡 1.2、忽略ARP请求 1.3、安装并启动nginx软件 2、配置…

【STM32】SPI接口(非连续传输)

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 前言 SPI简介 IO口初始化 SPI配置 时钟使能 SPI初始化 SPI使能 数据接收与发送 硬件SPI代码 MySPI.h MySPI.c 前言 【通信协议】SPI总线-CSDN博客 本篇博客学习使用STM32的…

Expo 开发ReactNative 后切换 eas 账号

修改slug app.json中的sulg字段更新为新账号应用sulg 修改projectId app.json中的extra.eas.projectId字段更新为新账号应用projectId 退出账号&#xff1a; eas logout 重新登录&#xff1a; eas login

基于WEB的学生综合测评系统的设计与实现

第1章 绪 论 1.1 系统开发背景 随着计算机技术的不断发展,在现代化社会中,信息的处理越来越依赖计算机来完成。在没有测评系统之前&#xff0c;所有的信息记录都是由人工记录维护&#xff0c;不但不方便&#xff0c;还经常出错&#xff0c;有了测评系统就可以方便的对各种信息…

.net maui安卓开发中使用明文传输(一)

背景:最近在做一个pad上的项目,目的是执行每日点检功能(就是检查设备的各项保养指标);前期用HBuilder做了一个,但是现场的触摸屏选用的是TouchPie 安卓版本是6.0版本,上次开发的软件可以在安卓7.0上完美兼容,但由于触摸屏安卓版本太低不能兼容;询问厂商才知道这款触摸…