Maison  >  Article  >  développement back-end  >  Les structures intégrées peuvent-elles être remplacées pour l’héritage de méthode dans Go ?

Les structures intégrées peuvent-elles être remplacées pour l’héritage de méthode dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-01 02:54:28799parcourir

  Can Embedded Structs Be Replaced for Method Inheritance in Go?

Structs intégrés et héritage de méthodes

Existe-t-il une alternative aux structures intégrées pour hériter des méthodes ?

Oui, il existe une manière alternative d'hériter des méthodes d'un type sans utiliser de structures intégrées. Cependant, cela nécessite une compréhension plus approfondie du système de types de Go.

Structs intégrés

Dans Go, l'intégration d'une structure vous permet d'accéder aux champs et aux méthodes de la structure intégrée. comme s'ils faisaient partie de la structure contenant. Il s'agit d'une fonctionnalité puissante qui peut être utilisée pour créer des héritages entre les types.

Le piège

Lorsque vous intégrez une structure, l'ensemble de méthodes de la structure intégrée n'est pas automatiquement promu dans la structure contenant. Pour promouvoir des méthodes, la structure intégrée doit être anonyme.

Promotion de méthode

La promotion de méthode est une fonctionnalité du langage qui permet d'accéder aux méthodes d'une structure intégrée anonyme comme si c'étaient des méthodes de la structure contenante. Ceci est réalisé en suivant ces règles :

  • Si le champ anonyme est de type T, les méthodes promues ont des récepteurs de type T et *T.
  • Si le champ anonyme est de type *T , les méthodes promues ont des récepteurs de type T ou *T.

Exemple

Considérez le code suivant :

<code class="go">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
}</code>

Dans ce Par exemple, la structure Node intègre une structure anonyme de type Props. Cela permet à la méthode GetString de Props d'être promue vers Node.

Approche alternative

Une approche alternative sans intégration consiste à utiliser un récepteur de pointeur. En passant un pointeur vers la fonction récepteur, vous pouvez accéder aux champs et méthodes de la structure sous-jacente sans avoir à l'intégrer.

Exemple

Voici une implémentation alternative en utilisant un récepteur pointeur :

<code class="go">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
}</code>

Dans cet exemple, nous utilisons un récepteur pointeur pour la méthode GetString. Cela nous permet d'accéder aux champs et aux méthodes de la structure Props sous-jacente sans avoir à l'intégrer.

Conclusion

Bien que les structures intégrées soient un outil puissant pour l'héritage, elles ne sont pas toujours le meilleur choix. Dans les cas où la promotion de la méthode n'est pas souhaitée ou nécessaire, l'utilisation d'un récepteur pointeur peut fournir une alternative plus flexible et plus performante.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn