"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 > ¿Se pueden reemplazar las estructuras incrustadas para la herencia del método en GO?

¿Se pueden reemplazar las estructuras incrustadas para la herencia del método en GO?

Publicado el 2025-02-06
Navegar:316

  Can Embedded Structs Be Replaced for Method Inheritance in Go?

incrustados estructuras y herencia de método

¿hay una alternativa a las estructuras integradas para heredar métodos?

sí, hay Una forma alternativa de heredar los métodos de un tipo sin usar estructuras integradas. Sin embargo, requiere una comprensión más profunda del sistema de tipo de GO.

incorporado estructuras

en Go, incrustar una estructura le permite acceder a los campos y métodos de la estructura incrustada como si fueran parte de la estructura que contiene. Esta es una característica poderosa que se puede utilizar para crear herencias entre tipos.

the gotcha

Cuando incrusta una estructura, el conjunto de métodos del struct incrustado no es promovido automáticamente a la estructura de contenido. Para promover métodos, la estructura integrada debe ser anónima.

promoción del método

La promoción del método es una característica de lenguaje que permite que se acceda a los métodos de una estructura integrada anónima como si se acceda como si se Eran métodos de la estructura que contiene. Esto se logra siguiendo estas reglas:

  • si el campo anónimo tiene el tipo t, los métodos promovidos tienen receptores de tipo t y *t.
  • si el campo anónimo tiene el tipo *t , los métodos promocionados tienen receptores de tipo t o *t.

Ejemplo

Considere el siguiente código:

type Props map[string]interface{}

func (p Props) GetString(key string) string {
    return p[key].(string)
}

type Node struct {
    Props
}

func main() {
    node := Node{"test": "foo"}
    fmt.Println(node.GetString("test")) // Output: foo
}

En este ejemplo, la estructura del nodo incorpora una estructura anónima de accesorios de tipo. Esto permite que el método GetString de los accesorios se promueva al nodo.

enfoque alternativo

alternativo sin incorporar es usar un receptor de puntero. Al pasar un puntero a la función receptor, puede acceder a los campos y métodos de la estructura subyacente sin tener que integrarlo.

ejemplo

aquí hay una implementación alternativa Usando un receptor de puntero:

type Props map[string]interface{}

func (p *Props) GetString(key string) string {
    return p[key].(string)
}

type Node struct {
    Props
}

func main() {
    node := &Node{Props{"test": "foo"}}
    fmt.Println(node.GetString("test")) // Output: foo
}

En este ejemplo, usamos un receptor de puntero para el método GetString. Esto nos permite acceder a los campos y métodos de la estructura de accesorios subyacentes sin tener que integrarlo.

conclusión

mientras que las estructuras integradas son una herramienta poderosa para la herencia, ellos no siempre son la mejor opción. En los casos en que la promoción del método no es deseada o necesaria, el uso de un receptor puntero puede proporcionar una alternativa más flexible y de rendimiento.

Ú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