Wie gehe ich mit gemeinsam genutzten Feldern in verschiedenen Strukturen mit Generics in Go um?

Linda Hamilton
Freigeben: 2024-10-29 04:51:02
Original
1012 Leute haben es durchsucht

How to Handle Shared Fields in Different Structs with Generics in Go?

Umgang mit gemeinsam genutzten Feldern in unterschiedlichen Strukturen mit Generika

Bei der Arbeit mit externen Paketen kann es schwierig sein, generische Funktionen zu definieren, die auf Strukturen mit gemeinsamen Mitgliedern angewendet werden. In diesem Artikel wird ein Problem untersucht, bei dem versucht wurde, eine generische Funktion zu erstellen, um gemeinsame Felder von zwei unterschiedlichen Firebase-Nachrichtenstrukturen zu ändern: Message und MulticastMessage.

Trotzdem Ähnlich wie bei Android-Konfigurationsfeldern haben diese Strukturen keine explizite Beziehung und Versuche, über Typparameter direkt auf ihre gemeinsamen Eigenschaften zuzugreifen, führten zu Fehlern. Der Grund dafür ist, dass Go 1.18 den Zugriff auf allgemeine Felder oder Methoden von Typparametern noch nicht unterstützt, wie in den verlinkten Threads erläutert.

Lösungsoptionen

Um dieses Problem zu beheben, gibt es mehrere Lösungen vorgeschlagen:

1. Typwechsel

Wenn die Anzahl der beteiligten Typen begrenzt ist, kann eine Typwechselanweisung verwendet werden, um auf die gemeinsam genutzten Felder zuzugreifen:

<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

2. Wrapper mit Methode

Diese Methode beinhaltet das Erstellen einer Wrapper-Struktur mit der zusätzlichen Methode, die Sie in der generischen Funktion verwenden möchten:

<code class="go">type MessageWrapper struct {
    messaging.Message
}

func (w *MessageWrapper) SetConfig(cfg messaging.Android) {
    *w.Android = cfg
}</code>
Nach dem Login kopieren

Die generische Funktion kann dann auf diese gemeinsame Methode zugreifen:

<code class="go">func highPriority[T wrappedMessage](message T) T {
    message.SetConfig(messaging.Android{"some-value"})
    return message
}</code>
Nach dem Login kopieren

3. Reflection

Wenn die Anzahl der Strukturen groß ist, kann Reflection verwendet werden, um dynamisch auf die gemeinsam genutzten Felder zuzugreifen:

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

Hinweise

Es ist wichtig zu beachten, dass diese Lösungen Folgendes haben ihre Einschränkungen:

  • Typschalter- und Wrapper-Methoden sind für eine große Anzahl von Typen weniger geeignet.
  • Reflexion erfordert adressierbare Strukturen und Felder.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit gemeinsam genutzten Feldern in verschiedenen Strukturen mit Generics in Go um?. 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