Fonction générique pour les membres de structure à partir de packages externes
Considérez l'objectif de créer une fonction unique pour ajouter des champs spécifiques à différentes structures de message Firebase, comme Message et MulticastMessage, qui partagent des champs communs de types similaires. Initialement, une tentative de définition d'une fonction générique highPriority à l'aide d'une contrainte de type comme suit a généré une erreur :
<code class="go">type firebaseMessage interface { *messaging.Message | *messaging.MulticastMessage } func highPriority[T firebaseMessage](message T) T { message.Android = &messaging.AndroidConfig{...} return message }</code>
Limitations de Go 1.18
Dans Go 1.18, l'accès les champs ou méthodes communs de paramètres de type ne sont pas pris en charge. Par conséquent, cette approche échoue.
Solution 1 : Commutateur de type
Pour un nombre limité de types dans l'union, 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
Une autre approche consiste à définir un type de wrapper qui implémente une méthode commune pour définir la configuration souhaitée :
<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
Pour les scénarios comportant de nombreuses structures, la réflexion peut être utilisée :
<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 supplémentaires :
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!