Maison  >  Article  >  développement back-end  >  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

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
Linda Hamiltonoriginal
2024-10-27 20:32:01720parcourir

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>

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

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!

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