嵌入 bindgen 函数
在这个例子中,我们将演示如何从 Go 应用中调用一些非常简单的 WebAssembly 函数。这些都是基于 Rust 语言编写,并且调用参数和返回值都比较复杂。编译工具需要函数声明 #[wasm_bindgen]
宏才能自动生成正确的代码,以便支持从 Go 中传递调用参数给 WebAssembly。
WebAssembly 规范只支持几种开箱即用的简单数据类型,并不支持字符串和数组类型。为了实现在 Go 中向 WebAssembly 传递更丰富的类型,编译器需要将其转换成简单的整数。比如,将一个字符串转换成内存地址和字符串长度。wasm_bindgen
工具嵌入在 rustwasmc 中自动执行转换。
在编写本文档的时候,我们要求 Rust 编译器必须是 1.50 或者以下的版本,这样才能够让 WebAssembly 函数与 WasmEdge 的 Go API 正常工作。当接口类型规范最终确定并完成支持后,我们会尽快迁移到。
我们在 Go 程序里面嵌入 WasmEdge 运行 WebAssembly 函数,Go 程序源码如下,ExecuteBindgen()
函数调用 #[wasm_bindgen]
转换后的 WebAssembly 函数并传递调用参数。
go get github.com/second-state/WasmEdge-go/wasmedge@v0.10.0 go build
执行 Go 应用程序,该应用将在 WasmEdge runtime 中执行嵌入的 WebAssembly 函数。
$ ./bindgen_funcs rust_bindgen_funcs/pkg/rust_bindgen_funcs_lib_bg.wasm Run bindgen -- say: hello bindgen funcs test Run bindgen -- obfusticate: N dhvpx oebja sbk whzcf bire gur ynml qbt Run bindgen -- lowest_common_multiple: 246 Run bindgen -- sha3_digest: [87 27 231 209 189 105 251 49 159 10 211 250 15 159 154 181 43 218 26 141 56 199 25 45 60 10 20 163 54 211 195 203] Run bindgen -- keccak_digest: [126 194 241 200 151 116 227 33 216 99 159 22 107 3 177 169 216 191 114 156 174 193 32 159 246 228 245 133 52 75 55 27]