


Wie kann ich vorhandene Typen in Go erweitern, wenn die direkte Erweiterung nicht unterstützt wird?
Dec 13, 2024 pm 06:24 PMErweitern vorhandener Typen in Go
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!

Heißer Artikel

Hot-Tools-Tags

Heißer Artikel

Heiße Artikel -Tags

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich?

Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren?

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go?

Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen?

Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache?

Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren?

Wie schreibe ich Dateien in Go Language bequem?

Wie schreibe ich Benchmarks, die die reale Leistung in Go genau widerspiegeln?
