Wire para Go: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué es Wire y para qué sirve?

\n\n

Wire es una biblioteca de inyección de dependencias (Dependency Injection, DI) para el lenguaje Go, desarrollada por el equipo de Google. A diferencia de muchos otros frameworks de DI que funcionan en tiempo de ejecución (runtime), Wire utiliza generación de código en la etapa de compilación. Esta es una diferencia clave: Wire analiza tu código y genera el archivo wire_gen.go que contiene toda la lógica de enlace de dependencias. Este enfoque elimina los errores relacionados con la reflexión (reflect) y hace que el código sea completamente tipado.

\n\n

¿Para qué sirve?

\n
    \n
  • Simplificación de la configuración: En lugar de crear manualmente todas las dependencias en main.go, Wire lo hace automáticamente.
  • \n
  • Pruebas: Puedes reemplazar fácilmente las implementaciones reales por mocks (simulaciones) para pruebas unitarias.
  • \n
  • Código limpio: El código se vuelve más modular y con menor acoplamiento (low coupling).
  • \n
  • Seguridad de tipos: Los errores de configuración se detectan en la etapa de compilación, no en tiempo de ejecución.
  • \n
\n\n

Wire es ideal para proyectos grandes donde la cantidad de dependencias se cuenta por decenas y centenas.

\n\n

Instalación

\n\n

Wire no es una biblioteca en el sentido tradicional (como un paquete que se importa). Es una herramienta de línea de comandos (CLI). La instalación se realiza a través del gestor de paquetes estándar de Go:

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

Después de ejecutar este comando, el archivo binario wire estará disponible en tu $GOPATH/bin (o $GOBIN). Asegúrate de que este directorio esté agregado a la variable de entorno PATH.

\n\n

Verifica la instalación:

\n\n
wire help
\n\n

Si ves la ayuda de comandos, ¡todo está listo para trabajar!

\n\n

Inicio rápido con ejemplo de código

\n\n

Vamos a crear una aplicación simple que saluda al usuario. Tendremos tres componentes: Message, Greeter (saludador) y Event (evento).

\n\n

Paso 1: Estructura del proyecto

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

Paso 2: Creamos los componentes (main.go)

\n\n
package main\n\nimport "fmt"\n\n// Message — estructura simple que contiene texto.\ntype Message struct {\n    Text string\n}\n\n// NewMessage — constructor para Message.\nfunc NewMessage(text string) Message {\n    return Message{Text: text}\n}\n\n// Greeter — estructura que saluda usando Message.\ntype Greeter struct {\n    Message Message\n}\n\n// NewGreeter — constructor para Greeter.\nfunc NewGreeter(m Message) Greeter {\n    return Greeter{Message: m}\n}\n\n// Greet — método que devuelve el saludo.\nfunc (g Greeter) Greet() Message {\n    return g.Message\n}\n\n// Event — estructura que representa un evento.\ntype Event struct {\n    Greeter Greeter\n}\n\n// NewEvent — constructor para Event.\nfunc NewEvent(g Greeter) Event {\n    return Event{Greeter: g}\n}\n\n// Start — método que inicia el evento.\nfunc (e Event) Start() {\n    msg := e.Greeter.Greet()\n    fmt.Println(msg.Text)\n}\n\nfunc main() {\n    // Creación manual de dependencias (sin Wire)\n    message := NewMessage("¡Hola, Wire!")\n    greeter := NewGreeter(message)\n    event := NewEvent(greeter)\n\n    event.Start()\n}
\n\n

Paso 3: Creamos el archivo wire.go

\n\n

Este archivo es el "proveedor" para Wire. Contiene funciones inicializadoras (providers) y una función que le dice a Wire qué debe ensamblar.

\n\n
//go:build wireinject\n// +build wireinject\n\npackage main\n\nimport "github.com/google/wire"\n\n// InitializeEvent — función que Wire usará para generar código.\n// Declara que necesitamos un Event, y Wire construirá el grafo de dependencias.\nfunc InitializeEvent(text string) Event {\n    w                    

Recommendations