Heim > Backend-Entwicklung > Golang > Wie arbeite ich mit verschiedenen Strukturen mit gemeinsamen Mitgliedern in Go unter Verwendung von Generics?

Wie arbeite ich mit verschiedenen Strukturen mit gemeinsamen Mitgliedern in Go unter Verwendung von Generics?

Susan Sarandon
Freigeben: 2024-10-26 15:29:30
Original
790 Leute haben es durchsucht

How to Work with Different Structs with Common Members in Go Using Generics?

Arbeiten mit unterschiedlichen Strukturen mit gemeinsamen Mitgliedern unter Verwendung von Generika

In Go stoßen Sie möglicherweise auf Szenarien, in denen Sie generische Funktionen erstellen möchten, die darauf ausgeführt werden verschiedene Strukturen, die gemeinsame Mitglieder haben. Allerdings wird der direkte Zugriff auf solche gemeinsamen Felder über Union-Typ-Einschränkungen hinweg in Go 1.18 noch nicht unterstützt.

Herausforderung:

Betrachten Sie zwei Nachrichtenstrukturen, Message und MulticastMessage, die jeweils enthalten Felder des gleichen Typs, z. B. Android. Sie möchten eine generische Funktion definieren, um diese Felder beiden Strukturen hinzuzufügen. Die Verwendung eines Typparameters, der auf eine Schnittstelle beschränkt ist, die beide Strukturen enthält, ermöglicht jedoch keinen direkten Zugriff auf ihre gemeinsamen Felder.

Lösung:

Lösung 1: Typ Schalter

Wenn nur wenige Strukturen beteiligt sind, kann ein Typwechsel eingesetzt 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

Erwägen Sie bei einer großen Anzahl von Strukturen, jede Struktur mit einer Methode zu umschließen, die die gemeinsame Funktionalität implementiert:

<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

Wenn Sie Wenn Sie viele Strukturen haben, ist Reflektion möglicherweise die bessere Option, erfordert jedoch adressierbare Strukturen und Felder:

<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 und Alternativen:

  • Wenn das gemeinsame Mitglieder sind Methoden. Möglicherweise müssen Sie die Methoden explizit für jeden Einschränkungstyp implementieren.
  • Ein anderer Ansatz besteht darin, benutzerdefinierte Schnittstellen für die allgemeinen Mitglieder zu verwenden. Dies erfordert jedoch eine Änderung der ursprünglichen Strukturen, was möglicherweise nicht in allen Fällen möglich ist.

Das obige ist der detaillierte Inhalt vonWie arbeite ich mit verschiedenen Strukturen mit gemeinsamen Mitgliedern in Go unter Verwendung von Generics?. 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