Maison  >  Article  >  développement back-end  >  Les fonctions génériques peuvent-elles modifier les champs partagés dans des structures non liées entre les packages ?

Les fonctions génériques peuvent-elles modifier les champs partagés dans des structures non liées entre les packages ?

DDD
DDDoriginal
2024-10-27 10:20:03920parcourir

 Can Generic Functions Modify Shared Fields in Unrelated Structs Across Packages?

Les fonctions génériques peuvent-elles fonctionner avec des membres partagés dans des structures de packages externes ?

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 :

  • La solution 2 offre le plus de flexibilité et permet le type sécurité.
  • La solution 3 est une approche plus générique mais nécessite une réflexion et peut entraîner une surcharge de performances.

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