Go - Wasmtime

## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# Using WebAssembly from Go

Wasmtime is available as a Go Module. This guide will go over adding Wasmtime to your project, and some provided examples of what can be done with WebAssembly modules.

Make sure you're using Go 1.12 or later with modules support.

## Getting started and simple example

First up you'll want to start a new module:

    mkdir hello-wasm
    cd hello-wasm
    go mod init hello-wasm
    go get github.com/bytecodealliance/wasmtime-go

Next, copy this example WebAssembly text module into your project. It exports a function for calculating the greatest common denominator of two numbers.

    (module
      (func $gcd (param i32 i32) (result i32)
        (local i32)
        block  ;; label = @1
          block  ;; label = @2
            local.get 0
            br_if 0 (;@2;)
            local.get 1
            local.set 2
            br 1 (;@1;)
          end
          loop  ;; label = @2
            local.get 1
            local.get 0
            local.tee 2
            i32.rem_u
            local.set 0
            local.get 2
            local.set 1
            local.get 0
            br_if 0 (;@2;)
          end
        end
        local.get 2
      )
      (export "gcd" (func $gcd))
    )

Next, we can write our code in `main.go` which reads this file and runs it:

    package main

    import (
        "fmt"
        "github.com/bytecodealliance/wasmtime-go"
    )

    func main() {
        engine := wasmtime.NewEngine()
        store := wasmtime.NewStore(engine)
        module, err := wasmtime.NewModuleFromFile(engine, "gcd.wat")
        check(err)
        instance, err := wasmtime.NewInstance(store, module, []wasmtime.AsExtern{})
        check(err)

        gcd := instance.GetExport(store, "gcd").Func()
        val, err := gcd.Call(store, 6, 27)
        check(err)
        fmt.Printf("gcd(6, 27) = %d\n", val.(int32))
    }

    func check(err error) {
        if err != nil {
            panic(err)
        }
    }

And finally we can build and run it:

    $ go run main.go
    gcd(6, 27) = 3

If this is the output you see, congrats! You've successfully ran your first WebAssembly code in Go!

## More examples and contributing

The `wasmtime` Go package lives in its own repository and has a number of other more advanced examples as well. Feel free to browse those, but if you find anything missing don't hesitate to open an issue and let us know if you have any questions!