Compilando com GOOS=wasip1 GOARCH=wasm
O target WASI do Go transforma pacotes comuns em módulos .wasm portáteis.
Busque em todas as páginas da documentação
O target WASI do Go transforma pacotes comuns em módulos .wasm portáteis.
O comando de compilação espelha a compilação cruzada para Linux ou Windows - defina GOOS e GOARCH, e então go build.
Entender quais flags importam, e quais arquivos (wasm_exec.js) pertencem a um target diferente, mantém seus scripts de build e matrizes de CI corretos.
GOOS=wasip1 com GOARCH=wasm seleciona a superfície de chamadas de sistema WASI Preview 1.
O linker do Go emite um módulo importando funções wasi_snapshot_preview1 em vez de chamadas de sistema específicas da plataforma.
Você executa o artefato com um host WASM externo (wasmtime, wazero, Spin) em vez do comando go.
Builds de lançamento comumente passam -ldflags="-s -w" para remover metadados de depuração.
Notas sobre wasm_exec.js para targets de navegador não se aplicam à saída wasip1.
Cartão de receita de referência rápida - pronto para copiar e colar.
GOOS=wasip1 GOARCH=wasm go build -ldflags="-s -w" -o app.wasm .
wasmtime run app.wasmQuando usar isso:
.wasmpackage main
import (
"encoding/json"
"fmt"
"os"
)
type config struct {
Name string `json:"name"`
}
func main() {
raw := os.Getenv("CONFIG_JSON")
if raw == "" {
fmt.Fprintln(os.Stderr, "CONFIG_JSON required")
os.Exit(1)
}
var cfg config
if err := json.Unmarshal([]byte(raw), &cfg); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
fmt.Printf("hello, %s\n", cfg.Name)
}go mod init example.com/wasigreet
# salve main.go, então:
GOOS=wasip1 GOARCH=wasm go build -ldflags="-s -w" -o greet.wasm .
wasmtime run --env CONFIG_JSON='{"name":"Ada"}' greet.wasmO que isso demonstra:
encoding/json, os) compilam para WASI sem tags.--env no wasmtime).os.Stderr mapeia para streams stderr do host.wasip1 mapeia operações de arquivo os para APIs fd WASI que o host deve implementar._start é o ponto de entrada que o host chama após instanciar a memória linear.go mod e vendoring funcionam da mesma forma que builds nativos; cgo não está disponível neste target.| Variável / Flag | Propósito |
|---|---|
GOOS=wasip1 | Seleciona a ABI de syscall WASI Preview 1 |
GOARCH=wasm | Seleciona a arquitetura WebAssembly |
-ldflags="-s -w" | Remove tabelas de símbolos/depuração para binários menores |
GOWASM=... | Historicamente alternava recursos WASM; signext/satconv ignorados no Go 1.26 |
GOFLAGS=-trimpath | Builds reproduzíveis sem caminhos do host incorporados |
| Artefato | Target | Como executar |
|---|---|---|
app.wasm | wasip1/wasm | wasmtime run, embed wazero, deploy Spin |
main.wasm + wasm_exec.js | js/wasm | Navegador ou Node com shim de runtime JS |
Não copie GOROOT/misc/wasm/wasm_exec.js para pacotes de implantação WASI.
// Arquivos de entrada separados para navegador - nunca compile estes em builds wasip1.
//go:build js && wasm
package browseronly# Padrão Makefile
build-wasi:
GOOS=wasip1 GOARCH=wasm go build -ldflags="-s -w" -o bin/app.wasm ./cmd/appAssumir que go run funciona - Não há emulador WASI dentro de go run; você deve executar com um host WASM. Correção: envolva wasmtime run ou wazero em alvos go:generate/Makefile.
Escritas de sistema de arquivos sem pré-abertura - os.Create("/tmp/x") falha se o host não mapeou /tmp. Correção: passe wasmtime run --dir /host/tmp::/tmp ou configure wazero FSConfig.
Misturar arquivos js/wasm em pacotes WASI - Imports acidentais de syscall/js quebram a compilação wasip1. Correção: isole o código do navegador por trás de tags de build js && wasm.
Esperar rede completa - WASI preview 1 não garante APIs TCP em todos os runtimes. Correção: confirme o suporte a sockets ou use gatilhos HTTP do Spin.
Binários enormes por surpresa - O runtime Go completo adiciona megabytes mesmo para fmt.Println. Correção: meça o tamanho cedo; considere TinyGo ou divida os caminhos quentes.
GOOS=wasi obsoleto - Documentação mais antiga referencia wasi; toolchains modernas usam wasip1. Correção: atualize scripts para wasip1 para Go 1.21+.
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
GOOS=js GOARCH=wasm | Interoperabilidade DOM/fetch em navegadores | Servidores headless ou embed wazero |
TinyGo -target=wasm | Orçamentos de tamanho rigorosos | Você precisa de libs completas com uso intensivo de reflect/generics |
Nativo GOOS=linux | Desempenho máximo e cobertura de syscall | Você precisa de plugins portáteis com sandbox |
Rust wasm32-wasi | O tamanho mínimo do binário é primordial | O padrão da equipe é Go e a cobertura da stdlib importa |
Go 1.21 estabilizou GOOS=wasip1 como o target de servidor WASM.
Go 1.26 otimiza ainda mais o chunking de heap WASM e a redução de instruções WASM.
Não. Desabilite cgo (CGO_ENABLED=0, o padrão para builds cruzadas) e mantenha as dependências puramente Go.
WASI mapeia args para os.Args.
wasmtime run app.wasm arg1 arg2 os popula como um processo normal.
Sim. Tags de build ainda dividem arquivos; use arquivos específicos de wasip1 quando precisar de caminhos de código apenas para o target.
Mantenha um build paralelo GOOS=linux para Delve, e use wasmtime run com logging para problemas de integração.
Builds DWARF não simplificados são maiores, mas podem ajudar depuradores WASM avançados.
O link dinâmico WASM é específico do host.
A maioria das equipes compila um módulo por plugin e expõe uma ABI estreita (por exemplo, JSON via stdin/stdout).
Esse é o target do navegador, não WASI.
Ele produz imports diferentes e requer wasm_exec.js.
Sim, sob o compilador Go completo.
TinyGo também suporta goroutines com um scheduler menor, sujeito aos seus limites.
Comece com -ldflags="-s -w", audite dependências e avalie TinyGo.
Go 1.26 reduz a memória do runtime, não necessariamente o tamanho do arquivo em disco.
go test não executa testes WASI nativamente.
Compile binários de teste para WASM e execute sob wasmtime, ou mantenha testes de lógica em linux/amd64 e smoke tests WASM em CI.
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 no build), chi (latest - verifique no build), gin (latest - verifique no build), echo (latest - verifique no build), google.golang.org/grpc (latest - verifique no build), sigs.k8s.io/controller-runtime (latest - verifique no build), kubebuilder (latest - verifique no build), tinygo (latest - verifique os targets de placa no build), wazero (latest - verifique no build) e golangci-lint (latest - verifique o conjunto de linters no build).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026