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
Susan SarandonOriginal
2024-10-26 15:29:30791Durchsuche

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>

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>

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>

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!

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