Skip to main content

WebAssembly with Golang

note
  • WebAssembly support for Go is excellent thanks to TinyGo.
  • TinyGo provides a compiler based on LLVM.
  • Go is among the most popular and the second most desirable language to work with WebAssembly (using wasmtime).

Install Golang

Go to go.dev and follow the instructions.

Install TinyGo

Go to tinygo.org and follow the instructions.

note

Tinygo requires golang version 1.15 through 1.17

Go code

Let's create a simple Go program that caculates the fibonacci sequence of an integer input.

Create a folder "fibonacci":

cd fibonacci
go mod init fibonacci

Create a file main.go, and add the following:

package main

import (
"bufio"
"flag"
"fmt"
"log"
"os"
"strconv"
)

func init() {
log.SetFlags(0)
}

func fib(n uint64) uint64 {
if n <= 1 {
return n
}
return fib(n-1) + fib(n-2)
}

func main() {
fmt.Println("Go - Fibonacci sequence example")

flag.Parse()

args := flag.Args()
if len(args) == 0 {
fmt.Println("Enter a non-negative number:")
sc := bufio.NewScanner(os.Stdin)
sc.Scan()
b, err := sc.Bytes(), sc.Err()
if err != nil {
log.Fatalf("Failed to read stdin: %s", err)
}
args = []string{string(b)}
}

for _, arg := range args {
n, err := strconv.ParseUint(arg, 10, 64)
if err != nil {
log.Fatalf("Failed to parse number: %s", err)
}
fmt.Printf("Fibonacci sequence number at index %d is %d\n", n, fib(n))
}
}

tip

Access the Go codex repository for code samples, including the fibonacci example.

Compile the Go code

go run main.go

Compile to Wasm

tinygo build -wasm-abi=generic -target=wasi -o main.wasm main.go

Run with Enarx

enarx run main.wasm