Maison  >  Article  >  développement back-end  >  Comment travailler avec différentes structures avec des membres communs dans Go en utilisant des génériques ?

Comment travailler avec différentes structures avec des membres communs dans Go en utilisant des génériques ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 15:29:30693parcourir

How to Work with Different Structs with Common Members in Go Using Generics?

Travailler avec différentes structures avec des membres communs à l'aide de génériques

Dans Go, vous pouvez rencontrer des scénarios dans lesquels vous souhaitez créer des fonctions génériques qui fonctionnent sur différentes structures qui partagent des membres communs. Cependant, l'accès direct à ces champs communs à travers les contraintes de type d'union n'est pas encore pris en charge dans Go 1.18.

Défi :

Considérez deux structures de message, Message et MulticastMessage, chacune contenant champs du même type, comme Android. Vous souhaitez définir une fonction générique pour ajouter ces champs aux deux structures. Cependant, utiliser un paramètre de type contraint à une interface contenant les deux structures ne permet pas d'accéder directement à leurs champs communs.

Solution :

Solution 1 : Type Switch

S'il n'y a que quelques structures impliquées, un commutateur de type peut être utilisé :

<code class="go">func highPriority[T firebaseMessage](message T) T {
    switch m := any(message).(type) {
    case *messaging.Message:
        setConfig(m.Android)
    case *messaging.MulticastMessage:
        setConfig(m.Android)
    }
    return message
}</code>

Solution 2 : Wrapper avec méthode

Pour un grand nombre de structures, pensez à envelopper chaque structure avec une méthode qui implémente la fonctionnalité commune :

<code class="go">type wrappedMessage interface {
    *MessageWrapper | *MultiCastMessageWrapper
    SetConfig(c foo.Config)
}

func highPriority[T wrappedMessage](message T) T {
    message.SetConfig(messaging.Android{"some-value"})
    return message
}</code>

Solution 3 : Réflexion

Si vous ont de nombreuses structures, la réflexion peut être une meilleure option, même si elle nécessite des structures et des champs adressables :

<code class="go">func highPriority[T firebaseMessage](message T) T {
    cfg := &messaging.Android{}
    reflect.ValueOf(message).Elem().FieldByName("Android").Set(reflect.ValueOf(cfg))
    return message
}</code>

Notes et alternatives :

  • Si le commun les membres sont des méthodes, vous devrez peut-être implémenter les méthodes explicitement pour chaque type de contrainte.
  • Une autre approche consiste à utiliser des interfaces personnalisées pour les membres communs. Cependant, cela nécessite de modifier les structures d'origine, ce qui n'est peut-être pas réalisable dans tous les cas.

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