Heim >Backend-Entwicklung >Golang >Wie kann ich vorhandene Typen in Go erweitern, wenn die direkte Erweiterung nicht unterstützt wird?

Wie kann ich vorhandene Typen in Go erweitern, wenn die direkte Erweiterung nicht unterstützt wird?

DDD
DDDOriginal
2024-12-13 18:24:14338Durchsuche

How Can I Extend Existing Types in Go When Direct Extension Is Not Supported?

Erweitern 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!

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