Go

在 WasmEdge 中运行 Go 程序的最佳方式是使用 TinyGo 将 Go 源代码编译为 WebAssembly。在本文中,我们将向你展示如何操作。

安装 TinyGo

在安装 TinyGo 之前,你的机器上必须已经安装了 Go。建议使用 Go v1.17 或更高版本。 对于 x86 处理器上的 Ubuntu 或其他基于 Debian 的 Linux 系统,你可以使用以下命令行来安装 TinyGo。其他平台请参考 TinyGo 文档

  1. wget https://github.com/tinygo-org/tinygo/releases/download/v0.21.0/tinygo_0.21.0_amd64.deb
  2. sudo dpkg -i tinygo_0.21.0_amd64.deb`

接下来,运行以下命令行检查是否安装成功。

  1. $ tinygo version
  2. tinygo version 0.21.0 linux/amd64 (using go version go1.16.7 and LLVM version 11.0.0)

Hello world

以下是个简单的 Go 应用程序,main() 函数主要用来向控制台打印一条消息。 main.go 文件中的源代码如下:

  1. package main
  2. func main() {
  3. println("Hello TinyGo from WasmEdge!")
  4. }

main() 函数中,你可以使用 Go 标准 API 读取/写入文件,以及访问命令行参数和 env 变量。

Hello world:编译和构建

接下来,使用 TinyGo 将 main.go 程序编译为 WebAssembly。

  1. tinygo build -o hello.wasm -target wasi main.go

你将在同一目录中看到一个名为 hello.wasm 的文件。这是一个 WebAssembly 字节码文件。

Hello world:运行

你可以使用 WasmEdge命令行 运行。

  1. $ wasmedge hello.wasm
  2. Hello TinyGo from WasmEdge!

一个简单的函数

第二个例子是一个 Go 函数,输入一个参数,计算一个斐波那契数。但是,为了让 Go 应用程序设置对操作系统的正确权限(例如,获得命令行参数的权限),你必须在源代码中包含一个空的 main() 函数。

  1. package main
  2. func main(){
  3. }
  4. //export fibArray
  5. func fibArray(n int32) int32{
  6. arr := make([]int32, n)
  7. for i := int32(0); i < n; i++ {
  8. switch {
  9. case i < 2:
  10. arr[i] = i
  11. default:
  12. arr[i] = arr[i-1] + arr[i-2]
  13. }
  14. }
  15. return arr[n-1]
  16. }

一个简单的函数:编译和构建

接下来,使用 TinyGo 将 main.go 程序编译为 WebAssembly。

  1. tinygo build -o fib.wasm -target wasi main.go

你将在同一目录中看到一个名为 fib.wasm 的文件。这是一个 WebAssembly 字节码文件。

一个简单的函数:运行

你可以使用 WasmEdge命令行 在其 --reactor 模式下运行它。 wasm 文件后面的命令行参数是函数名及其调用参数。

  1. $ wasmedge --reactor fib.wasm fibArray 10
  2. 34

性能提升

要为这些应用程序达到原生 Go 性能,你可以使用 wasmedgec 命令来 AOT 编译 wasm 程序,然后使用 wasmedge 命令运行它。

  1. $ wasmedgec hello.wasm hello.wasm
  2. $ wasmedge hello.wasm
  3. Hello TinyGo from WasmEdge!

对于 --reactor 模式,

  1. $ wasmedgec fib.wasm fib.wasm
  2. $ wasmedge --reactor fib.wasm fibArray 10
  3. 34