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 :
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!