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.
Um dieses Problem zu beheben, gibt es mehrere Lösungen vorgeschlagen:
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>
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>
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>
Es ist wichtig zu beachten, dass diese Lösungen Folgendes haben ihre Einschränkungen:
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!