Mejores prácticas de Go: administrar funciones para estructuras similares con campos compartidos
En Go, es común encontrar múltiples estructuras con campos similares y es necesario realizar operaciones idénticas en ellos. Para evitar la repetición de código y al mismo tiempo mantener la flexibilidad, considere las siguientes estrategias:
Creación de un tipo personalizado para el campo compartido:
Si el campo compartido es un tipo de datos simple ( por ejemplo, cadena), considere definir un tipo personalizado para ello. Esto le permite adjuntar métodos al tipo personalizado, que luego puede ser utilizado por cualquier estructura que incruste ese tipo.
type Version string
func (v Version) PrintVersion() {
fmt.Println("Version is", v)
}
Luego, incruste el tipo de versión en las estructuras:
type Game struct {
Name string
MultiplayerSupport bool
Genre string
Version
}
type ERP struct {
Name string
MRPSupport bool
SupportedDatabases []string
Version
}
Esto le permite imprimir la versión usando el método PrintVersion en el campo Versión:
g.PrintVersion()
e.PrintVersion()
Usando la reflexión:
Si el campo compartido puede ser de diferentes tipos o si desea más flexibilidad, puede usar la reflexión para invocar dinámicamente el campo apropiado método. Este enfoque es más complejo y tiene algunas implicaciones de rendimiento, pero proporciona mayor flexibilidad.
type Printer interface {
PrintVersion() error
}
func PrintVersion(p Printer) error {
t := reflect.TypeOf(p)
method, ok := t.MethodByName("PrintVersion")
if !ok {
return fmt.Errorf("object doesn't have a PrintVersion method")
}
return method.Func.Call([]reflect.Value{reflect.ValueOf(p)})[0].Interface().(error)
}
Luego puedes usar la función PrintVersion para invocar el método PrintVersion en cualquier objeto que implemente la interfaz de la impresora:
var game Game
var erp ERP
PrintVersion(game)
PrintVersion(erp)
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3