Heim >Backend-Entwicklung >Golang >Können generische Funktionen gemeinsam genutzte Felder in nicht verwandten Strukturen über Pakete hinweg ändern?
Problem:
Das Ziel besteht darin, a zu definieren generische Funktion, die bestimmte Felder in verschiedenen Firebase-Nachrichtenstrukturen ändern kann. Obwohl es überlappende Felder ähnlicher Typen gibt, fehlt den Message- und MulticastMessage-Strukturen eine explizite Beziehung. Der Versuch, dies mithilfe einer Schnittstellenbeschränkung zu handhaben, führt jedoch zu einem Fehler.
Lösung 1: Typwechsel
Wenn die Anzahl der Typen in der Union gering ist, a Der Typ-Switch-Ansatz kann funktionieren. Dazu gehört die manuelle Handhabung jedes Typs und das Aufrufen der entsprechenden Methoden, um die gewünschten Feldwerte festzulegen.
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 }
Lösung 2: Wrapper mit Methode
Eine alternative Lösung beinhaltet das Umschließen die ursprünglichen Strukturen und die Definition einer gemeinsamen Methode im Wrapper, die zum Festlegen der gemeinsam genutzten Felder verwendet werden kann.
type wrappedMessage interface { *MessageWrapper | *MultiCastMessageWrapper SetConfig(c foo.Config) } type MessageWrapper struct { messaging.Message } func (w *MessageWrapper) SetConfig(cfg messaging.Android) { *w.Android = cfg }
Lösung 3: Reflexion
Für die Handhabung eines größeren Anzahl der Strukturen kann Reflexion verwendet werden, um die gemeinsam genutzten Felder dynamisch festzulegen. Beachten Sie jedoch, dass hierfür die Strukturen und Felder adressierbar sein müssen.
func highPriority[T firebaseMessage](message T) T { cfg := &messaging.Android{} reflect.ValueOf(message).Elem().FieldByName("Android").Set(reflect.ValueOf(cfg)) return message }
Hinweise:
Das obige ist der detaillierte Inhalt vonKönnen generische Funktionen gemeinsam genutzte Felder in nicht verwandten Strukturen über Pakete hinweg ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!