Noções Básicas de WebAssembly & TinyGo
10 exemplos para você começar com WASM & TinyGo - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para você começar com WASM & TinyGo - 7 básicos e 3 intermediários.
brew install wasmtime (macOS) ou baixe de wasmtime.dev.tinygo version.mkdir wasmdemo && cd wasmdemo && go mod init example.com/wasmdemo.A menor prova de que o Go emite um módulo .wasm executável.
package main
import "fmt"
func main() {
fmt.Println("hello from wasip1/wasm")
}GOOS=wasip1 GOARCH=wasm go build -o hello.wasm .
wasmtime run hello.wasmGOOS=wasip1 seleciona importações WASI Preview 1 em vez de chamadas de sistema Linux.hello.wasm - sem binário Go separado.wasmtime run fornece as importações do host WASI que o módulo espera.Relacionado: Compilando com GOOS=wasip1 GOARCH=wasm - flags e opções do linker
Reduza o tamanho do download com flags de linker padrão.
GOOS=wasip1 GOARCH=wasm go build -ldflags="-s -w" -o hello.wasm .-s omite a tabela de símbolos; -w omite informações de depuração DWARF.Relacionado: Otimização de Tamanho WASM: TinyGo vs gc WASM - táticas mais profundas de tamanho
WASI expõe os.Getenv através de importações do host.
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println("USER=", os.Getenv("USER"))
}wasmtime run --env USER=ada hello-env.wasm--env explícitas no wasmtime para testes reproduzíveis.O acesso ao sistema de arquivos requer que o host pré-abra diretórios.
GOOS=wasip1 GOARCH=wasm go build -o write.wasm .
mkdir -p /tmp/wasmout
wasmtime run --dir /tmp/wasmout::/data write.wasmos.WriteFile("/data/out.txt", []byte("ok"), 0o644)--dir host::guest.FSConfig.TinyGo emite módulos muito menores quando seu subconjunto da stdlib é suficiente.
package main
import "fmt"
func main() {
fmt.Println("hello from tinygo wasm")
}tinygo build -target=wasm -o tinyhello.wasm .
wasmtime run tinyhello.wasm-target=wasm seleciona o backend WASM genérico (verifique os targets específicos de placa separadamente).Relacionado: TinyGo para Microcontroladores e WASM Restrito - targets de placa
Isole pontos de entrada exclusivos para navegador de builds WASI.
//go:build js && wasm
package main
import "syscall/js"
func main() {
js.Global().Get("console").Call("log", "hello browser")
select {}
}GOOS=js GOARCH=wasm go build -o main.wasm .select {} mantém main vivo para que os callbacks possam ser acionados.wasm_exec.js de $(go env GOROOT)/misc/wasm/wasm_exec.js em hosts de HTML.syscall/js em pacotes wasip1.Relacionado: syscall/js: Go no Navegador - callbacks DOM
Inspecione a superfície do módulo antes de incorporar.
wasm-tools print hello.wasm | head_start, exportação de memória e nomes de importação WASI.wasm-tools via cargo install wasm-tools ou seu gerenciador de pacotes.Execute um módulo guest a partir de um serviço Go sem cgo.
package main
import (
"context"
"os"
"github.com/tetratelabs/wazero"
"github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1"
)
func main() {
ctx := context.Background()
r := wazero.NewRuntime(ctx)
defer r.Close(ctx)
wasi_snapshot_preview1.MustInstantiate(ctx, r)
wasmBytes, _ := os.ReadFile("hello.wasm")
mod, _ := r.Instantiate(ctx, wasmBytes)
defer mod.Close(ctx)
start := mod.ExportedFunction("_start")
_, _ = start.Call(ctx)
}wasi_snapshot_preview1 registra as importações WASI que o módulo Go precisa.Instantiate compila e carrega o bytecode; reutilize Runtime entre requisições em servidores.context para limitar o tempo de execução do guest.Relacionado: Runtimes Host WASI: wasmtime, wazero & Spin - comparação de runtimes
Detecte builds quebrados antes do deploy.
GOOS=wasip1 GOARCH=wasm go build -o /tmp/app.wasm ./...
wasmtime run /tmp/app.wasmGOOS=linux GOARCH=amd64.wasmtime run diferentes de zero.wasmtime e tinygo nas imagens de CI para reprodutibilidade.Relacionado: Melhores Práticas de WebAssembly & TinyGo - CI e higiene de importação
Faça escolhas de toolchain baseadas em dados.
GOOS=wasip1 GOARCH=wasm go build -ldflags="-s -w" -o gc.wasm .
tinygo build -target=wasm -o tiny.wasm .
ls -lh gc.wasm tiny.wasmRelacionado: Guia de Decisão: Go Nativo vs TinyGo vs Rust WASM - trade-offs classificados
Versões da Stack: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, go fix modernizers - verifique o patch na build), chi (última versão - verifique na build), gin (última versão - verifique na build), echo (última versão - verifique na build), google.golang.org/grpc (última versão - verifique na build), sigs.k8s.io/controller-runtime (última versão - verifique na build), kubebuilder (última versão - verifique na build), tinygo (última versão - verifique os targets de placa na build), wazero (última versão - verifique na build) e golangci-lint (última versão - verifique o conjunto de linters na build).
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026