Heim >Backend-Entwicklung >Golang >Wie arbeite ich mit verschiedenen Strukturen mit gemeinsamen Mitgliedern in Go unter Verwendung von 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:
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!