Problème :
L'objectif est de définir un fonction générique qui peut modifier des champs spécifiques dans différentes structures de message Firebase. Malgré le chevauchement de champs de types similaires, les structures Message et MulticastMessage n'ont pas de relation explicite. Cependant, tenter d'utiliser une contrainte d'interface pour gérer cela génère une erreur.
Solution 1 : Type Switch
Si le nombre de types dans l'union est faible, un l’approche de commutation de type peut fonctionner. Cela implique de gérer manuellement chaque type et d'appeler les méthodes appropriées pour définir les valeurs de champ souhaitées.
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 }
Solution 2 : Wrapper avec méthode
Une solution alternative consiste à envelopper les structures d'origine et en définissant une méthode commune dans le wrapper qui peut être utilisée pour définir les champs partagés.
type wrappedMessage interface { *MessageWrapper | *MultiCastMessageWrapper SetConfig(c foo.Config) } type MessageWrapper struct { messaging.Message } func (w *MessageWrapper) SetConfig(cfg messaging.Android) { *w.Android = cfg }
Solution 3 : Réflexion
Pour gérer un plus grand nombre de structures, la réflexion peut être utilisée pour définir les champs partagés de manière dynamique. Cependant, notez que cela nécessite que les structures et les champs soient adressables.
func highPriority[T firebaseMessage](message T) T { cfg := &messaging.Android{} reflect.ValueOf(message).Elem().FieldByName("Android").Set(reflect.ValueOf(cfg)) return message }
Remarques :
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!