从 Rust 到 Go 的回调函数
短信预约 -IT技能 免费直播动态提醒
问题内容
我正在尝试创建从 go 调用 rust 函数的可能性,然后所述 rust 函数将函数回调到 go。我使用 cgo 作为 go 和 rust 之间的 ffi 接口。 以下是我的 go 代码(class="lazy" data-src/main.go):
package main
import (
"c"
"fmt"
"unsafe"
)
//export cosmoscallbackwrapper
func cosmoscallbackwrapper(data *c.uchar, datalen c.int) {
// convert data to go slice
godata := c.gobytes(unsafe.pointer(data), datalen)
// call the actual callback function
cosmoscallback(godata)
}
// setcosmoscallback sets the callback function to be called by the move vm.
func setcosmoscallback(callback func([]byte)) {
cosmoscallback = callback
c.set_cosmos_callback((c.cosmos_callback)(unsafe.pointer(c.cosmoscallbackwrapper)))
}
var cosmoscallback func([]byte)
func main() {
// create a new move interpreter
// set the callback function
setcosmoscallback(func(data []byte) {
fmt.println("received data from move vm:", data)
// handle data and call cosmos sdk functions as needed
})
}
这是我的 rust 代码 (class="lazy" data-src/lib.rs)
use std::os::raw::{c_char, c_int};
use std::ffi::cstring;
use std::sync::mutex;
#[macro_use] extern crate lazy_static;
pub fn main() {
}
pub type cosmoscallback = extern "c" fn(*const c_char, c_int);
lazy_static! {
static ref callback: mutex
这是我的 cargo.toml 文件:
[package]
name = "go-move"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
[dependencies]
libc = "0.2"
lazy_static = "1.4.0"
[workspace]
members = [ ".",]
这是 lib/move.h(共享库的头文件):
#ifndef move_vm_lib_h
#define move_vm_lib_h
#include
//typedef void (*cosmos_callback)(const unsigned char *data, int data_len);
//void set_cosmos_callback(cosmos_callback callback);
typedef void (*cosmos_callback)(const uint8_t* data, int32_t data_len);
void set_cosmos_callback(cosmos_callback callback);
#endif
这是我的 makefile:
shell := /bin/bash
.phony: build
os = $(shell uname)
clean:
rm -rf bin
rm -rf target
build:
@echo the os is $(os)
mkdir bin
cargo build --release
ifeq ($(os),linux)
cp target/release/libgo_move.so bin/
else
cp target/release/libgo_move.dylib bin/
endif
cp -a lib/. bin/
go build --ldflags="-l./bin -lgo_move" -o bin/main class="lazy" data-src/main.go
run:
export ld_library_path=./bin && ./main
文件结构如下:
class="lazy" data-src
main.go
main.rs
bin
libgo_move.so (after cargo build)
lib
move.h
cargo.toml
makefile
运行 make clean build
后,我得到以下输出:
cp target/release/libgo_move.so bin/
cp -a lib/. bin/
go build -o bin/main class="lazy" data-src/main.go
# command-line-arguments
class="lazy" data-src/main.go:27:59: could not determine kind of name for C.cosmosCallbackWrapper
class="lazy" data-src/main.go:27:25: could not determine kind of name for C.cosmos_callback
class="lazy" data-src/main.go:27:2: could not determine kind of name for C.set_cosmos_callback
由于某种原因,它找不到 ffi 函数。
正确答案
这是一个愚蠢的错误:
必须在导入之前进行。仅此而已。
以上就是从 Rust 到 Go 的回调函数的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
从 Rust 到 Go 的回调函数
下载Word文档到电脑,方便收藏和打印~
下载Word文档
猜你喜欢
从 Rust 到 Go 的回调函数
问题内容我正在尝试创建从 go 调用 rust 函数的可能性,然后所述 rust 函数将函数回调到 go。我使用 cgo 作为 go 和 rust 之间的 ffi 接口。以下是我的 go 代码(src/main.go):package
2024-02-06
2024-04-02
2024-04-02
2023-05-18
GO语言中回调函数的使用
本文主要介绍了GO语言中回调函数的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-06
如何从 Go Lambda 函数返回 HTML?
php小编新一在介绍如何从 Go Lambda 函数返回 HTML时,将为大家详细解答这个问题。Go Lambda 函数是一种在云计算中运行的函数,返回 HTML 页面对于许多 Web 开发人员来说是一个常见的需求。在本文中,我们将探讨如何
2024-02-08
2024-04-02
GO语言中的回调函数如何使用
这篇文章主要介绍了GO语言中的回调函数如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇GO语言中的回调函数如何使用文章都会有所收获,下面我们一起来看看吧。0.前言回调函数是一种在编程中常见的技术,通常在异
2023-07-05
2024-04-02
Go回调函数和闭包怎么使用
本篇内容介绍了“Go回调函数和闭包怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Go回调函数和闭包当函数具备以下两种特性的时候,就可
2023-06-30
巧用 Python 函数:从定义到调用,再到参数传递
Python 函数是程序中代码的集合,可以重复使用。函数的定义、调用和参数传递是函数使用的基础。
2024-02-06
golang函数中回调函数的作用
go 中回调函数在函数中作为参数传递,用于在特定事件或条件发生后执行特定动作,增强代码的可重用性和扩展性。主要作用为:事件处理:作为事件侦听器的回调处理程序,在事件发生时采取动作。数据处理:对切片或映射中的每个元素进行处理。接口实现:通过回
2024-04-25
keras回调函数的使用
本文主要介绍了keras回调函数的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-13
2024-04-02
2023-08-19
2023-05-16
C++ 函数调用函数指针:参数传递和返回值的回调机制
回答: 函数指针允许在运行时动态地调用函数,实现回调机制。参数传递: 函数指针可以作为参数传递给高阶函数,高阶函数对其进行调用并返回结果。返回值的回调机制: 函数可以返回函数指针,实现回调机制,使得一个函数可以作为另一个函数的返回值被传递。
2024-05-02
python 回调函数和回调方法的实现分析
回调与事件驱动
回调函数有比较重要的意义:它在是事件驱动的体现
我们试想一个场景,如果我们触发了某个事件,比如点击事件
那么只要给这个点击事件绑定一个或多个处理事件,也就是回调函数
我们就可以在点击事件被触发后(结束后)调用相应的方法来处理
2022-06-04
Go 中调用的函数如何访问调用函数的参数?
Go 中调用的函数可以通过函数参数来获取调用函数的参数。在 Go 中,参数可以通过传值或传引用的方式传递给函数,函数可以通过参数来获取调用者传递的值或指针。如果参数是值类型,函数内部的操作将会在参数的拷贝上进行,不会影响到调用者传递的原始值
2024-02-09
2024-04-02