Maison > développement back-end > Golang > le corps du texte

Comment gérer les champs partagés dans différentes structures avec des génériques dans Go ?

Linda Hamilton
Libérer: 2024-10-29 04:51:02
original
950 Les gens l'ont consulté

How to Handle Shared Fields in Different Structs with Generics in Go?

Gestion des champs partagés dans différentes structures avec des génériques

Lorsque vous travaillez avec des packages externes, il peut être difficile de définir des fonctions génériques qui opèrent sur des structures contenant des membres communs. Cet article explore un problème dans lequel une tentative a été faite pour créer une fonction générique pour modifier les champs partagés de deux structures de message Firebase distinctes, Message et MulticastMessage.

Malgré avoir Avec des champs de configuration Android similaires, ces structures n'ont aucune relation explicite et les tentatives d'accès à leurs propriétés communes directement à l'aide de paramètres de type entraînaient des erreurs. La raison en est que Go 1.18 ne prend pas encore en charge l'accès aux champs communs ou aux méthodes de paramètres de type, comme expliqué dans les fils de discussion liés.

Options de solution

Pour résoudre ce problème, plusieurs solutions sont proposées. proposé :

1. Type Switch

Si le nombre de types impliqués est limité, une instruction type switch peut être utilisée pour accéder aux champs partagés :

<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>
Copier après la connexion

2. Wrapper avec méthode

Cette méthode implique de créer une structure wrapper avec la méthode supplémentaire que vous souhaitez utiliser dans la fonction générique :

<code class="go">type MessageWrapper struct {
    messaging.Message
}

func (w *MessageWrapper) SetConfig(cfg messaging.Android) {
    *w.Android = cfg
}</code>
Copier après la connexion

La fonction générique peut alors accéder à cette méthode commune :

<code class="go">func highPriority[T wrappedMessage](message T) T {
    message.SetConfig(messaging.Android{"some-value"})
    return message
}</code>
Copier après la connexion

3. Réflexion

Si le nombre de structures est important, la réflexion peut être utilisée pour accéder dynamiquement aux champs partagés :

<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>
Copier après la connexion

Notes

Il est important de noter que ces solutions ont leurs limites :

  • Les méthodes de commutation de type et de wrapper sont moins adaptées à un grand nombre de types.
  • La réflexion nécessite des structures et des champs adressables.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!