September 22, 2025

Rodando Go no Navegador com WebAssembly: Integração Real com JavaScript

Como compilar código Go para WebAssembly e utilizá-lo lado a lado com JavaScript em uma aplicação React, explorando as possibilidades de performance, portabilidade e integração multi-linguagem.

Rodando Go no Navegador com WebAssembly: Integração Real com JavaScript

Já pensou em rodar Go dentro do navegador como se fosse apenas mais uma função JavaScript?
Isso é possível graças ao WebAssembly (Wasm).

Veja um exemplo prático de como compilar um programa simples em Go, expor funções para o JavaScript e utilizá-las diretamente em qualquer aplicação web moderna.


Por que usar Go + Wasm?

  • 🚀 Performance próxima ao nativo no browser.
  • 🔒 Privacidade: processamento direto no cliente, sem enviar dados ao servidor.
  • 🌍 Portabilidade: o mesmo módulo .wasm roda no navegador, em ambientes serverless ou no backend.
  • 🐹 Go traz vantagens em concorrência (goroutines) e bibliotecas maduras, sem reescrever lógica em JS.

E o melhor: você pode fazer o mesmo com Rust, C/C++, C#, Python (Pyodide) ou até AssemblyScript — escolhendo a linguagem mais adequada para cada cenário.


Passo a passo: Hello World em Go + Wasm

  1. Crie o arquivo main.go:
package main

import "syscall/js"

func hello(this js.Value, args []js.Value) interface{} {
    return js.ValueOf("Hello from Go in WebAssembly!")
}

func main() {
    c := make(chan struct{}, 0)
    js.Global().Set("hello", js.FuncOf(hello))
    <-c
}
  1. Inicialize um módulo Go (necessário para compilar com Go Modules):
go mod init example.com/wasm-demo
go mod tidy
  1. Compile para WebAssembly:
GOOS=js GOARCH=wasm go build -o main.wasm
  1. Baixe ou copie o runtime JavaScript (wasm_exec.js):

Se o Go foi instalado com Homebrew, normalmente o caminho é:

cp "$(go env GOROOT)/lib/wasm/wasm_exec.js" .

Se o arquivo não existir, baixe direto do repositório oficial, ajustando para sua versão (go version):

curl -o wasm_exec.js https://raw.githubusercontent.com/golang/go/go1.25.1/misc/wasm/wasm_exec.js
  1. Crie o index.html mínimo:
<script src="wasm_exec.js"></script>
<script>
  const go = new Go();
  WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject)
    .then((result) => {
      go.run(result.instance);
      alert(hello()); // chama a função Go exposta
    });
</script>
  1. Sirva os arquivos com npx serve:
npx serve .

Depois abra http://localhost:3000 no navegador e veja o Go rodando dentro do JavaScript 🎉.


E agora?

Esse é só o “Hello World”.
Mas o mesmo padrão pode ser usado para:

  • Processar dados financeiros (ex: CNAB, boletos, cálculos de risco).
  • Executar cálculos matemáticos ou criptográficos direto no browser.
  • Reaproveitar bibliotecas Go existentes em aplicações web modernas.
  • Rodar simuladores ou regras de negócio no cliente sem expor lógica sensível em JS.

Conclusão

O WebAssembly está se consolidando como uma ponte real entre linguagens e o ecossistema JavaScript.
Você não precisa mais ficar limitado ao JS: pode escrever em Go, Rust, C++ ou Python, compilar para Wasm e rodar em qualquer lugar que suporte navegador ou Node.js.

💬 Já experimentou rodar outra linguagem dentro do navegador usando WebAssembly?