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

Voici quelques options de titre, chacune mettant en évidence un aspect différent de l'article : Se concentrer sur le problème : * Comment définir des champs dans différentes structures de message Firebase avec des génériques dans Go 1.18 ? * Gène

Linda Hamilton
Libérer: 2024-10-27 20:32:01
original
729 Les gens l'ont consulté

Here are a few title options, each highlighting a different aspect of the article:

Focusing on the problem:

* How to Set Fields in Different Firebase Message Structs with Generics in Go 1.18?
* Generic Function for Struct Members from External Packages:

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 = &amp;messaging.AndroidConfig{...}
    return message
}</code>
Copier après la connexion

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

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

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 := &amp;messaging.Android{}
    reflect.ValueOf(message).Elem().FieldByName("Android").Set(reflect.ValueOf(cfg))
    return message
}</code>
Copier après la connexion

Notes supplémentaires :

  • Pour plus d'informations sur les limitations des paramètres de type, reportez-vous à [Comment puis-je définir un champ de structure dans mon interface comme contrainte de type ?](https://go.dev/play/p/9iG0eSep6Qo).
  • Pour plus de détails sur l'implémentation de méthodes communes pour les types dans une contrainte d'union, consultez [Dans les génériques Go, comment utiliser une méthode commune pour les types dans une contrainte d'union ?](https://go.dev/play/p/JUHp9Fu27Yt ).

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!