Heim >Backend-Entwicklung >Golang >Wie kann ich vorhandene Typen in Go erweitern, wenn die direkte Erweiterung nicht unterstützt wird?
In Go wird das Erweitern vorhandener Typen, die in externen Paketen definiert sind, nicht direkt unterstützt. Es gibt jedoch Problemumgehungen, um ein ähnliches Ergebnis zu erzielen.
Betrachten wir das in der Frage bereitgestellte Beispiel:
package util import( "net/http" "github.com/0xor1/gorillaseed/src/server/lib/mux" ) func (r *mux.Route) Subroute(tpl string, h http.Handler) *mux.Route{ return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) } func (r *mux.Router) Subroute(tpl string, h http.Handler) *mux.Route{ return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) }
Beim Versuch, diesen Code zu kompilieren, stößt man auf den Fehler: „Kann nicht definiert werden neue Methoden für den nicht-lokalen Typ mux.Router". Dies liegt daran, dass Go keine direkte Erweiterung von Typen aus externen Paketen zulässt.
Workaround 1: Definieren Sie einen Wrapper-Typ
Eine Workaround besteht darin, eine Wrapper-Struktur zu definieren, die einbettet den ursprünglichen Typ und stellt die gewünschten Methoden bereit. Zum Beispiel:
type MyRoute struct { *mux.Route } func (r *MyRoute) Subroute(tpl string, h http.Handler) *mux.Route { return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) } type MyRouter struct { *mux.Router } func (r *MyRouter) Subroute(tpl string, h http.Handler) *mux.Route { return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) }
Problemumgehung 2: Typzusicherung
Eine andere Option besteht darin, die Typzusicherung zu verwenden, um den ursprünglichen Typ in eine Schnittstelle{} und dann in eine zu konvertieren Benutzerdefinierter Typ, der die gewünschten Methoden bereitstellt. Zum Beispiel:
func (r interface{}) Subroute(tpl string, h http.Handler) *mux.Route { switch v := r.(type) { case *mux.Route: return v.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) case *mux.Router: return v.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) default: panic("unreachable") } }
Hinweis: Diese Problemumgehungen können zusätzliche Komplexität mit sich bringen und sollten mit Vorsicht verwendet werden. Vermeiden Sie nach Möglichkeit die Änderung externer Typen und definieren Sie stattdessen Ihre eigenen Typen, die die von Ihnen benötigte Funktionalität umschließen oder erweitern.
Das obige ist der detaillierte Inhalt vonWie kann ich vorhandene Typen in Go erweitern, wenn die direkte Erweiterung nicht unterstützt wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!