"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo administrar funciones para estructuras Go similares con campos compartidos?

¿Cómo administrar funciones para estructuras Go similares con campos compartidos?

Publicado el 2024-11-08
Navegar:458

How to Manage Functions for Similar Go Structs with Shared Fields?

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)
Último tutorial Más>

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