Wire para Go: guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

O que é Wire e para que serve?

\n\n

Wire é uma biblioteca para injeção de dependências (Dependency Injection, DI) para a linguagem Go, desenvolvida pela equipe do Google. Ao contrário de muitos outros frameworks DI que funcionam em tempo de execução (runtime), o Wire usa geração de código em tempo de compilação. Esta é a principal diferença: o Wire analisa seu código e gera o arquivo wire_gen.go, que contém toda a lógica de vinculação de dependências. Essa abordagem elimina erros relacionados à reflexão (reflect) e torna o código totalmente tipado.

\n\n

Para que serve?

\n
    \n
  • Simplificação da configuração: Em vez de criar manualmente todas as dependências no main.go, o Wire faz isso automaticamente.
  • \n
  • Testes: Você pode facilmente substituir implementações reais por mocks (simulações) para testes unitários.
  • \n
  • Limpeza do código: O código se torna mais modular e menos acoplado (low coupling).
  • \n
  • Segurança de tipos: Erros de configuração são detectados em tempo de compilação, não em tempo de execução.
  • \n
\n\n

O Wire é ideal para projetos grandes, onde o número de dependências chega a dezenas e centenas.

\n\n

Instalação

\n\n

Wire não é uma biblioteca no sentido tradicional (como um pacote que você importa). É uma ferramenta de linha de comando (CLI). A instalação é feita através do gerenciador de pacotes padrão do Go:

\n\n
go install github.com/google/wire/cmd/wire@latest
\n\n

Após executar este comando, o arquivo binário wire estará disponível em seu $GOPATH/bin (ou $GOBIN). Certifique-se de que este diretório foi adicionado à variável de ambiente PATH.

\n\n

Verifique a instalação:

\n\n
wire help
\n\n

Se você vir a ajuda sobre os comandos — está tudo pronto para funcionar.

\n\n

Início rápido com exemplo de código

\n\n

Vamos criar uma aplicação simples que saúda o usuário. Teremos três componentes: Message, Greeter (saudador) e Event (evento).

\n\n

Passo 1: Estrutura do projeto

\n\n
myapp/\n├── main.go\n├── wire.go\n└── wire_gen.go  (será gerado)
\n\n

Passo 2: Criamos os componentes (main.go)

\n\n
package main\n\nimport "fmt"\n\n// Message — estrutura simples contendo texto.\ntype Message struct {\n    Text string\n}\n\n// NewMessage — construtor para Message.\nfunc NewMessage(text string) Message {\n    return Message{Text: text}\n}\n\n// Greeter — estrutura que saúda usando Message.\ntype Greeter struct {\n    Message Message\n}\n\n// NewGreeter — construtor para Greeter.\nfunc NewGreeter(m Message) Greeter {\n    return Greeter{Message: m}\n}\n\n// Greet — método que retorna a saudação.\nfunc (g Greeter) Greet() Message {\n    return g.Message\n}\n\n// Event — estrutura representando um evento.\ntype Event struct {\n    Greeter Greeter\n}\n\n// NewEvent — construtor para Event.\nfunc NewEvent(g Greeter) Event {\n    return Event{Greeter: g}\n}\n\n// Start — método que inicia o evento.\nfunc (e Event) Start() {\n    msg := e.Greeter.Greet()\n    fmt.Println(msg.Text)\n}\n\nfunc main() {\n    // Criação manual de dependências (sem Wire)\n    message := NewMessage("Olá, Wire!")\n    greeter := NewGreeter(message)\n    event := NewEvent(greeter)\n\n    event.Start()\n}
\n\n

Passo 3: Criamos o arquivo wire.go

\n\n

Este arquivo é o "provedor" para o Wire. Ele contém funções inicializadoras (providers) e uma função que diz ao Wire o que precisa ser montado.

\n\n
//go:build wireinject\n// +build wireinject\n\npackage main\n\nimport "github.com/google/wire"\n\n// InitializeEvent — função que o Wire usará para gerar código.\n// Ela declara que precisamos de um Event, e o Wire construirá o grafo de dependências.\nfunc InitializeEvent(text string) Event {\n    w                    

Recommendations