DI es una librería minimalista y de alto rendimiento que facilita la
inyección y resolución de dependencias en proyectos Go sin imponer
frameworks pesados ni generar código.
Su objetivo principal es velocidad en lectura (Get, Resolve) y ejecución
(Invoke), manteniendo la API simple y 100 % orientada a valores nativos
de reflect.
| Función | Descripción | ns/op * |
|---|---|---|
Map |
Registra un valor concreto o asocia una interfaz con su implementación. | ~530 |
Provide |
Registra un provider (función) que se evalúa «lazy» o «eager». | - |
Get |
Recupera un valor por tipo en ~12 ns sin asignaciones. | 12 ns |
Resolve |
Inyecta dependencias sobre variables existentes (pointer). | 15 ns |
Invoke |
Ejecuta una función resolviendo sus argumentos (con caché interno). | 440 ns |
ResolveT[T] |
Versión genérica de Resolve para Go 1.21+. |
— |
* Benchmarks medidos en un Intel i7-6600U @ 2.60 GHz, Go 1.21,
Linux amd64 (new-3.4.txt).
Consulta la carpeta benchmarks/ para reproducirlos.
go github.com/jad21/dipackage main
import (
"fmt"
"github.com/jad21/di"
)
type Config struct{ Msg string }
func main() {
inj := di.New()
// Registrar un valor
inj.Map(&Config{Msg: "Hola DI"})
// Resolver con genéricos
cfg, _ := di.GetT[*Config](inj)
fmt.Println(cfg.Msg) // > Hola DI
// Invocar una función
inj.Invoke(func(c *Config) {
fmt.Println("Invoke:", c.Msg)
})
// Resolve sobre variable existente
var c2 *Config
_ = inj.Resolve(&c2)
fmt.Println("Resolve:", c2.Msg)
}# todos los benchmarks, incluido el nuevo de Resolve
go test -bench=. ./...Salida esperada (resumen):
BenchmarkInjectorMap-4 ~530 ns/op
BenchmarkInjectorGet-4 ~12 ns/op
BenchmarkInjectorResolve-4 ~15 ns/op
BenchmarkInjectorInvoke-4 ~440 ns/op
// Obtener un valor por tipo con cero reflejo extra
val, ok := di.GetT[*MyType](inj)
// Resolver e inyectar sobre variable local
cfg, err := di.ResolveT[*Config](inj)- Bifurca el repositorio y crea tu rama (
git checkout -b nueva-funcionalidad) - Asegúrate de que
go test ./...pasa sin errores ni race. - Envía tu pull request con una descripción clara.
- Añadir soporte opcional para Wire-style code-gen
- Mejora de ergonomía con métodos genéricos (Go 1.22+)
- Integración con contextos (
InvokeCtx)
MIT © JAD21, Jose A Delgado.