Seguimos con fx, ahora vamos a hacer otro ejemplo con fx y Go basados en este ejemplo hecho con spring y java.
Primero vamos a hacer una interfaz que nos permita obtener un saludo :
type Saludor interface {
GetSaludo() string
}
Luego vamos a implementarla en español e ingles :
type SaludorEs struct {
}
func (saludoEs SaludorEs) GetSaludo() string {
return "Hola !!"
}
type SaludorEn struct {
}
func (saludoEn SaludorEn) GetSaludo() string {
return "Hi !!"
}
Y vamos a hacer métodos que nos permitan crear estas implementaciones :
func CrearSaludadorEs() (Saludor, error) {
return SaludorEs{}, nil
}
func CrearSaludadorEn() (Saludor, error) {
return SaludorEn{}, nil
}
Y ahora vamos a hacer un método que sea polimorfico que imprima el saludo :
func Saludar(saludor Saludor) {
fmt.Println(saludor.GetSaludo())
}
Como ven referencia a la interfaz por lo tanto se puede usar con el SaludadorEs y el SaludadorEn porque implementan esta interfaz.
Y por ultimo vamos hacer 2 app de fx una en español y la otra en ingles :
func main() {
appEs := fx.New(
fx.Provide(
CrearSaludadorEs,
),
fx.Invoke(Saludar),
)
ctxEs, cancelEs := context.WithCancel(context.Background())
defer cancelEs()
if err := appEs.Start(ctxEs); err != nil {
log.Fatal(err)
}
appEn := fx.New(
fx.Provide(
CrearSaludadorEn,
),
fx.Invoke(Saludar),
)
ctxEn, cancelEn := context.WithCancel(context.Background())
defer cancelEn()
if err := appEn.Start(ctxEn); err != nil {
log.Fatal(err)
}
}
y la salida es la siguiente :
[Fx] PROVIDE main.Saludor <= main.CrearSaludadorEs()
[Fx] PROVIDE fx.Lifecycle <= go.uber.org/fx.New.func1()
[Fx] PROVIDE fx.Shutdowner <= go.uber.org/fx.(*App).shutdowner-fm()
[Fx] PROVIDE fx.DotGraph <= go.uber.org/fx.(*App).dotGraph-fm()
[Fx] INVOKE main.Saludar()
Hola !!
[Fx] RUNNING
[Fx] PROVIDE main.Saludor <= main.CrearSaludadorEn()
[Fx] PROVIDE fx.Lifecycle <= go.uber.org/fx.New.func1()
[Fx] PROVIDE fx.Shutdowner <= go.uber.org/fx.(*App).shutdowner-fm()
[Fx] PROVIDE fx.DotGraph <= go.uber.org/fx.(*App).dotGraph-fm()
[Fx] INVOKE main.Saludar()
Hi !!
[Fx] RUNNING
Y listo!!