Hier sind einige Titeloptionen, die jeweils einen anderen Aspekt des Artikels hervorheben: Konzentrieren Sie sich auf das Problem: * Wie lege ich Felder in verschiedenen Firebase-Nachrichtenstrukturen mit Generics in Go 1.18 fest? * Gen

Linda Hamilton
Freigeben: 2024-10-27 20:32:01
Original
802 Leute haben es durchsucht

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:

Generische Funktion für Strukturmitglieder aus externen Paketen

Betrachten Sie das Ziel, eine einzige Funktion zum Hinzufügen bestimmter Felder zu verschiedenen Firebase-Nachrichtenstrukturen zu erstellen. wie Message und MulticastMessage, die gemeinsame Felder ähnlicher Typen verwenden. Anfänglich führte ein Versuch, eine generische Funktion mit hoher Priorität mithilfe einer Typbeschränkung wie folgt zu definieren, zu einem Fehler:

<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>
Nach dem Login kopieren

Einschränkungen von Go 1.18

In Go 1.18, Zugriff Allgemeine Felder oder Methoden vom Typ Parameter werden nicht unterstützt. Daher schlägt dieser Ansatz fehl.

Lösung 1: Typwechsel

Für eine begrenzte Anzahl von Typen in der Union kann ein Typwechsel verwendet werden:

<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>
Nach dem Login kopieren

Lösung 2: Wrapper mit Methode

Ein anderer Ansatz besteht darin, einen Wrapper-Typ zu definieren, der eine gemeinsame Methode implementiert, um die gewünschte Konfiguration festzulegen:

<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>
Nach dem Login kopieren

Lösung 3: Reflexion

Für Szenarien mit zahlreichen Strukturen kann Reflexion eingesetzt werden:

<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>
Nach dem Login kopieren

Zusätzliche Hinweise:

  • Weitere Informationen zu Typparametereinschränkungen finden Sie unter [Wie kann ich ein Strukturfeld in meiner Schnittstelle als Typbeschränkung definieren?](https://go.dev/play/p/9iG0eSep6Qo).
  • Ausführliche Informationen zum Implementieren allgemeiner Methoden für Typen in einer Union-Einschränkung finden Sie unter [Wie verwende ich in Go-Generika eine gemeinsame Methode für Typen in einer Union-Einschränkung?](https://go.dev/play/p/JUHp9Fu27Yt ).

Das obige ist der detaillierte Inhalt vonHier sind einige Titeloptionen, die jeweils einen anderen Aspekt des Artikels hervorheben: Konzentrieren Sie sich auf das Problem: * Wie lege ich Felder in verschiedenen Firebase-Nachrichtenstrukturen mit Generics in Go 1.18 fest? * Gen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage