Go Composición e incrustación


Ejemplo

La composición proporciona una alternativa a la herencia. Una estructura puede incluir otro tipo por nombre en su declaración:

type Request struct {
    Resource string
}

type AuthenticatedRequest struct {
    Request
    Username, Password string
}

En el ejemplo anterior, AuthenticatedRequest contendrá cuatro miembros públicos: Resource , Request , Username y Password .

Las estructuras compuestas se pueden instanciar y utilizar de la misma manera que las estructuras normales:

func main() {
    ar := new(AuthenticatedRequest)
    ar.Resource = "example.com/request"
    ar.Username = "bob"
    ar.Password = "P@ssw0rd"
    fmt.Printf("%#v", ar)
}

jugar en el patio de recreo

Incrustación

En el ejemplo anterior, la Request es un campo incrustado. La composición también se puede lograr mediante la incrustación de un tipo diferente. Esto es útil, por ejemplo, para decorar un Struct con más funcionalidad. Por ejemplo, continuando con el ejemplo de Recursos, queremos una función que formatee el contenido del campo de Recursos para prefijarlo con http:// o https:// . Tenemos dos opciones: crear los nuevos métodos en AuthenticatedRequest o incrustarlos desde una estructura diferente:

type ResourceFormatter struct {}

func(r *ResourceFormatter) FormatHTTP(resource string) string {
    return fmt.Sprintf("http://%s", resource)
}
func(r *ResourceFormatter) FormatHTTPS(resource string) string {
    return fmt.Sprintf("https://%s", resource)
}


type AuthenticatedRequest struct {
    Request
    Username, Password string
    ResourceFormatter
}

Y ahora la función principal podría hacer lo siguiente:

func main() {
    ar := new(AuthenticatedRequest)
    ar.Resource = "www.example.com/request"
    ar.Username = "bob"
    ar.Password = "P@ssw0rd"

    println(ar.FormatHTTP(ar.Resource))
    println(ar.FormatHTTPS(ar.Resource))

    fmt.Printf("%#v", ar)
}

Observe que el AuthenticatedRequest que tiene una estructura incorporada ResourceFormatter .

Pero la desventaja es que no puedes acceder a objetos fuera de tu composición. Por lo tanto, ResourceFormatter no puede acceder a los miembros de AuthenticatedRequest .

jugar en el patio de recreo