Introdução ao WebAssembly e Go
WebAssembly (Wasm) é um formato binário de instruções de baixo nível que é executado no navegador com velocidade quase nativa. Em combinação com a linguagem Go (Golang), você obtém uma ferramenta poderosa para criar aplicações web de alto desempenho. Go compila para WebAssembly, permitindo transferir cálculos complexos, algoritmos e até jogos diretamente para o navegador, sem sacrificar o desempenho.
Neste artigo, vamos abordar como configurar o ambiente, escrever um módulo simples em Go, compilá-lo para Wasm e integrá-lo com JavaScript. Você aprenderá sobre os pacotes principais, limitações e melhores práticas.
Configuração do ambiente para compilar Go para Wasm
Instalação do Go e dependências do WebAssembly
Antes de tudo, certifique-se de ter o Go versão 1.11 ou superior instalado (recomendado 1.21+). O suporte a WebAssembly é nativo. Para compilar, use a variável de ambiente GOOS=wasm GOARCH=wasm.
Você também precisará do arquivo de suporte wasm_exec.js, que acompanha o Go. Copie-o para a raiz do projeto:
cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" .Estrutura do projeto
Vamos criar uma estrutura simples:
my-wasm-app/├── main.go├── wasm_exec.js├── index.html└── main.wasm (será criado após a compilação)Escrevendo um módulo em Go para WebAssembly
Exemplo simples: função de soma
Crie o arquivo main.go com o seguinte conteúdo:
package main
import ( "syscall/js")
func add(this js.Value, args []js.Value) interface{} { if len(args) < 2 { return 0 } a := args[0].Int() b := args[1].Int() return a + b}
func main() { c := make(chan struct{}, 0)
js.Global().Set("goAdd", js.FuncOf(add))
<-c}Aqui usamos o pacote syscall/js para interagir com JavaScript. A função add recebe dois argumentos e retorna sua soma. O canal c bloqueia a finalização do programa para que o módulo permaneça ativo.
Compilação para Wasm
Execute o comando:
GOOS=wasm GOARCH=wasm go build -o main.wasm main.goO resultado será um arquivo main.wasm com cerca de 1–2 MB (para um exemplo simples). Em produção, use a flag -ldflags="-s -w" para reduzir o tamanho.
Integração com HTML e JavaScript
Criação da página HTML
Crie o arquivo index.html:
<!DOCTYPE html><html lang="pt"><head> <meta charset="UTF-8"> <title>Go + WebAssembly</title> <script src="wasm_exec.js"></script></head><body> <h2>Calculadora Go no navegador</h2> <input type="number" id="num1" value="5"> <input type="number" id="num2" value="10"> <button onclick="calculate()">Somar</button> <p>Resultado: <span id="result">0</span></p>
<script> const go = new Go(); WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject) .then((result) => { go.run(result.instance); console.log("Módulo WebAssembly carregado"); });
function calculate() { const a = parseInt(document.getElementById('num1').value); const b = parseInt(document.getElementById('num2').value); const sum = goAdd(a, b); document.getElementById('result').innerText = sum; } </script></body></html>Observe: a função goAdd torna-se global graças à chamada js.Global().Set("goAdd", ...) no código Go.