Heim >Backend-Entwicklung >Golang >Ist dies ein gültiger Anwendungsfall für Generika?
Jetzt habe ich in meinem Code eine Menge sich wiederholender Arbeiten, die so aussehen.
type fp = func(arg1 string, arg2 int, arg3 []string) bool func decorator(fp fp, arg1 string, arg2 int, arg3 []string) { // do some stuff prior to running fp res := fp(arg1, arg2, arg3) // do some other stuff depending on res }
Mein Problem ist, dass ich jedes Mal, wenn ich einen neuen fp-Typ mit einer anderen Anzahl/einem anderen Typ von Parametern hinzufügen möchte, diese Methode neu definieren muss, sodass ich den Dekorator in meinem Code am Ende 4-5 Mal neu definiere und dies wahrscheinlich tun muss mehr. Ich möchte es durch Decorator ersetzen
type FP = func(a ...interface{}) bool func Decorator(fp FP, argDetails interface{}) { // do stuff res := fp(a) // do other stuff }
Und lassen Sie fp den Typ bestätigen. Aber ich bin mir nicht sicher, ob dies Probleme verursacht/ein schlechter Anwendungsfall ist, da ich viel darüber gesehen habe, dass die Schnittstelle nicht verwendet wird/Leistungsprobleme verursacht werden.
Generika helfen aus bestimmten Gründen nicht, insbesondere Generika helfen nur beim Typ, nicht bei der Anzahl der Parameter. Ich persönlich würde dieses Problem anders angehen:
func decorator(fp func()) { // do stuff fp() // do other stuff }Nennen Sie es mit einer Schließung:
var res sometype decorator(func() { res = originalfunc(arg1, arg2, arg3) })Auf der Aufrufseite ist es etwas ausführlich, aber es funktioniert absolut für jede Funktionssignatur – jede Anzahl oder Art von Parametern und jede Anzahl oder Art von Rückgabewert. Es funktioniert sogar mit Methodenaufrufen. Es hört sich so an, als würden Sie auf der Grundlage der Ergebnisse eine Logik anwenden, also könnten Sie genauso gut:
func Decorator(fp func() bool) { // do stuff res := fp() // do other stuff } var res someType Decorator(func() bool { res = originalFunc(arg1, arg2, arg3) return res })Auch wenn die dekorierte Funktion mehr Rückgabewerte als dieser Bool hat oder wenn Sie eine andere Logik verwenden möchten (z. B. wenn sie einen Fehler zurückgibt, möchten Sie
verwenden). != 转换为 bool),它仍然可以工作。 nil
Das obige ist der detaillierte Inhalt vonIst dies ein gültiger Anwendungsfall für Generika?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!