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