Heim >Backend-Entwicklung >Golang >Wie gehe ich mit gemeinsam genutzten Feldern in verschiedenen Strukturen mit Generics in Go um?

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

Linda Hamilton
Linda HamiltonOriginal
2024-10-29 04:51:021059Durchsuche

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>

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>

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>

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>

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!

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