Heim >Backend-Entwicklung >Golang >Können generische Funktionen gemeinsam genutzte Felder in nicht verwandten Strukturen über Pakete hinweg ändern?

Können generische Funktionen gemeinsam genutzte Felder in nicht verwandten Strukturen über Pakete hinweg ändern?

DDD
DDDOriginal
2024-10-27 10:20:031034Durchsuche

 Can Generic Functions Modify Shared Fields in Unrelated Structs Across Packages?

Können generische Funktionen mit gemeinsam genutzten Mitgliedern über externe Paketstrukturen hinweg funktionieren?

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:

  • Lösung 2 bietet die größte Flexibilität und ermöglicht Typisierung Sicherheit.
  • Lösung 3 ist ein allgemeinerer Ansatz, erfordert jedoch Überlegungen und kann zu Leistungseinbußen führen.

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!

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