Heim  >  Artikel  >  Backend-Entwicklung  >  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

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

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>

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>

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>

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>

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!

Stellungnahme:
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