Introdução ao WebAssembly em Go

Nos últimos anos, o desenvolvimento web tem passado por transformações significativas, e uma das tecnologias que mais tem despertado o interesse de desenvolvedores é o WebAssembly (Wasm).

Originalmente projetado para ser executado em navegadores, o Wasm se tornou uma tecnologia promissora também para ambientes de backend. Mas como o WebAssembly se relaciona com o Go? E por que você deveria se importar?

Antes de responder essas perguntas, vamos explorar um pouco melhor do que é WebAssembly e onde essa tecnologia pode ser aplicada.

O que é WebAssembly?

WebAssembly é um formato binário que pode ser executado em diversos ambientes, como navegadores, servidores e dispositivos de IoT. Em linhas gerais, um ambiente Wasm oferece uma maneira de rodar código de baixo nível de maneira segura e eficiente, independentemente da linguagem de programação utilizada para criar o binário.

Algumas características principais do WebAssembly incluem:

  • Portabilidade: Pode ser executado em diferentes plataformas sem modificações.
  • Desempenho: Quase tão rápido quanto código nativo.
  • Segurança: O sandboxing impede que o código malicioso afete o sistema.

Em resumo, o Wasm permite que aplicações desenvolvidas em linguagens como Go, Rust e C/C++ sejam executadas em qualquer lugar que suporte WebAssembly, desde navegadores até servidores.

Casos de Uso do WebAssembly

Agora que entendemos melhor o que é WebAssembly, vamos ver alguns cenários onde podemos aplicar essa tecnologia.

1. Aplicações Web Performáticas

O Wasm permite que você execute aplicações intensivas em computação diretamente no navegador, como editores de imagem, ferramentas CAD ou jogos.

2. Backend Multiplataforma

No backend, o Wasm pode ser utilizado para criar módulos de código reutilizáveis, portáveis e seguros, que podem ser executados em diferentes servidores sem ajustes.

3. IoT e Edge Computing

O Wasm é ideal para dispositivos IoT e computação em borda (Edge Computing), pois oferece um ambiente seguro e leve para executar código em dispositivos com recursos limitados.

Criando um Módulo WebAssembly em Go

Com os conceitos em mente, vamos implementar um simples programa em Go que faz a soma de dois valores. Depois de implementado, vamos gerar o binário compatível com WebAssembly.

Para iniciar, vamos criar um novo módulo chamado exemplo-wasm.

go mod init exemplo-wasm

Agora, crie um arquivo main.go com o seguinte conteúdo:

package main

import (
    "syscall/js"
)

func add(this js.Value, args []js.Value) interface{} {
    a := args[0].Int()
    b := args[1].Int()
    return a + b
}

func main() {
    js.Global().Set("add", js.FuncOf(add))
    select {}
}

Este código cria uma função chamada add que recebe dois números e retorna sua soma. A função é exposta ao ambiente JavaScript através do pacote syscall/js.

Com a implementação finalizada, vamos executar o comando abaixo para gerar o binário de extensão .wasm.

GOOS=js GOARCH=wasm go build -o main.wasm

Note que não há nada de especial no comando de build que executamos.

Após o arquivo ter sido gerado, precisamos copiar o js com runtime para Go. O comando abaixo irá copiar o arquivo para o mesmo diretório do arquivo main.wasm.

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

Por fim, crie um arquivo index.html com o conteúdo abaixo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WebAssembly com Go</title>
    <script src="wasm_exec.js"></script>
</head>
<body>
    <h1>Teste WebAssembly com Go</h1>
    <button onclick="executeAdd()">Somar 5 + 3</button>
    <script>
        async function loadWasm() {
            const go = new Go();
            const wasm = await WebAssembly.instantiateStreaming(fetch('main.wasm'), go.importObject);
            go.run(wasm.instance);
        }

        function executeAdd() {
            alert(add(5, 3));
        }

        loadWasm();
    </script>
</body>
</html>

Executando o Projeto

Você pode utilizar um servidor HTTP simples para servir os arquivos gerados:

python3 -m http.server

Abra o navegador e acesse http://localhost:8000. Você verá o botão que, ao ser clicado, exibirá um alert com o resultado da soma.

Conclusão

O WebAssembly é uma tecnologia promissora que pode expandir o alcance do seu código Go. Com ele, você pode criar aplicações mais performáticas, seguras e portáveis, seja no frontend ou no backend.

Se você gostou desse conteúdo, inscreva-se na nossa newsletter para não perder nenhuma novidade!

E se você quer apoiar o nosso trabalho e acessar conteúdos exclusivos, torne-se um assinante pago do nosso blog. Além de nos ajudar a continuar criando conteúdos de qualidade, você terá acesso a materiais avançados e discussões aprofundadas sobre Go, cloud e arquitetura de software.

Gostou do conteúdo?

  • Inscreva-se na nossa newsletter para receber mais dicas práticas sobre Go, Kubernetes e desenvolvimento de software diretamente no seu e-mail!
  • 🚀 Torne-se um assinante pago do blog e tenha acesso a conteúdos exclusivos, como tutoriais avançados, estudos de caso e muito mais!

Faça parte da comunidade!

Receba os melhores conteúdos sobre Go, Kubernetes, arquitetura de software, Cloud e esteja sempre atualizado com as tendências e práticas do mercado.

Livros Recomendados

Abaixo listei alguns dos melhores livros que já li sobre GO.

Deixe uma resposta