Skip to content

Calls and guest state

Call an export

go
result, err := inst.Call(
	ctx,
	"add",
	wago.ValueI32(20),
	wago.ValueI32(22),
)
if err != nil {
	return err
}

fmt.Println(result[0].I32()) // 42

Call checks the values against the export's Wasm signature.

Wasm typeConstructorReader
i32wago.ValueI32(v)value.I32()
i64wago.ValueI64(v)value.I64()
f32wago.ValueF32(v)value.F32()
f64wago.ValueF64(v)value.F64()

SIMD and reference types have dedicated values too. Check value.Type() when the signature is discovered dynamically.

Honor cancellation

go
ctx, cancel := context.WithTimeout(parent, 250*time.Millisecond)
defer cancel()

out, err := inst.Call(ctx, "work", wago.ValueI32(1000))

A background context keeps the ordinary fast path. A cancellable context lets Wago interrupt long-running guest execution. Blocking Go work inside a host function still needs its own deadline.

Read and write memory

go
if ok := inst.Write(128, []byte("hello")); !ok {
	return fmt.Errorf("guest memory write is out of bounds")
}

data, ok := inst.Read(128, 5)
if !ok {
	return fmt.Errorf("guest memory read is out of bounds")
}
fmt.Println(string(data))

Read returns a copy. Typed little-endian helpers include ReadUint32Le, ReadUint64Le, WriteUint32Le, and their floating-point counterparts.

For zero-copy access to the default memory, use Instance.Memory().Bytes(). The returned view reflects live guest state, so keep instance serialization rules in mind.

Read and write globals

go
count, err := inst.GlobalValue("count")
if err != nil {
	return err
}
fmt.Println(count.I32())

if err := inst.SetGlobalValue("count", wago.ValueI32(100)); err != nil {
	return err
}

Setting an immutable global or supplying the wrong value type returns an error.

Low-level calls

Package-level Compile, Instantiate, and Invoke use raw uint64 slots with helpers such as wago.I32 and wago.AsI32. Use that path for a deliberately low-level embedder. The runtime API is the better default for typed values, context, plugins, and lifecycle.

Next

Released under the Apache 2.0 License.