Conceptos básicos de WebAssembly y TinyGo
10 ejemplos para empezar con WASM y TinyGo: 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para empezar con WASM y TinyGo: 7 básicos y 3 intermedios.
brew install wasmtime (macOS) o descárgalo desde wasmtime.dev.tinygo version.mkdir wasmdemo && cd wasmdemo && go mod init example.com/wasmdemo.La prueba más pequeña de que Go emite un módulo .wasm ejecutable.
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 selecciona las importaciones de WASI Preview 1 en lugar de las llamadas al sistema de Linux.hello.wasm, sin binario de Go separado.wasmtime run proporciona las importaciones del host WASI que el módulo espera.Relacionado: Compilación con GOOS=wasip1 GOARCH=wasm - banderas y opciones del enlazador
Reduce el tamaño de descarga con banderas estándar del enlazador.
GOOS=wasip1 GOARCH=wasm go build -ldflags="-s -w" -o hello.wasm .-s omite la tabla de símbolos; -w omite la información de depuración DWARF.Relacionado: Optimización de tamaño de WASM: TinyGo vs gc WASM - tácticas de tamaño más profundas
WASI expone os.Getenv a través de importaciones del 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 en wasmtime para pruebas reproducibles.El acceso al sistema de archivos requiere que el host pre-abra directorios.
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 mucho más pequeños cuando su subconjunto de stdlib es 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 selecciona el backend WASM genérico (verifica las placas específicas por separado).Relacionado: TinyGo para microcontroladores y WASM con restricciones - objetivos de placa
Aísla los puntos de entrada solo para el navegador de las compilaciones 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 {} mantiene main vivo para que los callbacks puedan activarse.wasm_exec.js de $(go env GOROOT)/misc/wasm/wasm_exec.js en hosts de HTML.syscall/js en paquetes wasip1.Relacionado: syscall/js: Go en el navegador - callbacks DOM
Inspecciona la superficie del módulo antes de incrustarlo.
wasm-tools print hello.wasm | head_start, la exportación de memoria y los nombres de importación WASI.wasm-tools a través de cargo install wasm-tools o tu gestor de paquetes.Ejecuta un módulo invitado desde un servicio Go sin 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 las importaciones WASI que el módulo Go necesita.Instantiate compila y carga el bytecode; reutiliza Runtime entre solicitudes en servidores.context para limitar el tiempo de ejecución del invitado.Relacionado: Runtimes Host WASI: wasmtime, wazero y Spin - comparación de runtimes
Detecta compilaciones rotas antes de desplegar.
GOOS=wasip1 GOARCH=wasm go build -o /tmp/app.wasm ./...
wasmtime run /tmp/app.wasmGOOS=linux GOARCH=amd64.wasmtime run.wasmtime y tinygo en las imágenes de CI para reproducibilidad.Relacionado: Mejores prácticas de WebAssembly y TinyGo - higiene de CI e importaciones
Toma decisiones basadas en datos sobre las herramientas.
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: Guía de decisión: Go nativo vs TinyGo vs Rust WASM - compensaciones clasificadas
Versiones de la pila: Esta página se escribió para Go 1.26.x (predeterminado Green Tea GC, go fix modernizers - verifica el parche en la compilación), chi (última versión - verifica en la compilación), gin (última versión - verifica en la compilación), echo (última versión - verifica en la compilación), google.golang.org/grpc (última versión - verifica en la compilación), sigs.k8s.io/controller-runtime (última versión - verifica en la compilación), kubebuilder (última versión - verifica en la compilación), tinygo (última versión - verifica los objetivos de placa en la compilación), wazero (última versión - verifica en la compilación) y golangci-lint (última versión - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 18 jul 2026