Looking for go Answers? Try Ask4KnowledgeBase
Looking for go Keywords? Try Ask4Keywords

Go Composition et enrobage


Exemple

La composition offre une alternative à l'héritage. Une structure peut inclure un autre type par nom dans sa déclaration:

type Request struct {
    Resource string
}

type AuthenticatedRequest struct {
    Request
    Username, Password string
}

Dans l'exemple ci-dessus, AuthenticatedRequest contiendra quatre membres publics: Resource , Request , Username et Password .

Les structures composites peuvent être instanciées et utilisées de la même manière que les structures normales:

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

jouer sur le terrain de jeu

Enrobage

Dans l'exemple précédent, Request est un champ incorporé. La composition peut également être obtenue en intégrant un type différent. Ceci est utile, par exemple, pour décorer une structure avec plus de fonctionnalités. Par exemple, en continuant avec l'exemple Resource, nous voulons une fonction qui formate le contenu du champ Resource pour le préfixer avec http:// ou https:// . Nous avons deux options: créer les nouvelles méthodes sur AuthenticatedRequest ou l’ incorporer à partir d’une structure différente:

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
}

Et maintenant, la fonction principale pourrait faire ce qui suit:

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)
}

Regardez ce que AuthenticatedRequest a une structure incorporée ResourceFormatter .

Mais l'inconvénient est que vous ne pouvez pas accéder à des objets en dehors de votre composition. Donc, ResourceFormatter ne peut pas accéder aux membres de AuthenticatedRequest .

jouer sur le terrain de jeu