Je souhaite ajouter une méthode utilitaire aux gorilla/mux
types de routage et de routeur:
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)
}
mais le compilateur m'informe
Impossible de définir de nouvelles méthodes sur un mux de type non local.
Alors, comment pourrais-je y parvenir? Est-ce que je crée un nouveau type de structure qui a des champs mux.Route et mux.Router anonymes? Ou autre chose?
go
extension-methods
Daniel Robinson
la source
la source
“extension methods are not object-oriented”
) pour C #, mais en les regardant aujourd'hui, je me suis immédiatement souvenu des interfaces de Go (et de son approche pour repenser l'orientation des objets), puis j'ai eu cette question.Réponses:
Comme le compilateur le mentionne, vous ne pouvez pas étendre les types existants dans un autre package. Vous pouvez définir votre propre alias ou sous-package comme suit:
ou en intégrant le routeur d'origine:
la source
mux.Router
instances enMyRouter
s? par exemple si vous avez une bibliothèque qui retournemux.Router
mais que vous souhaitez utiliser vos nouvelles méthodes?Je voulais développer la réponse donnée par @jimt ici . Cette réponse est correcte et m'a énormément aidé à régler ce problème. Cependant, il y a quelques mises en garde concernant les deux méthodes (alias, incorporer) avec lesquelles j'ai eu des problèmes.
Remarque : j'utilise les termes parent et enfant, même si je ne suis pas sûr que ce soit le meilleur pour la composition. Fondamentalement, parent est le type que vous souhaitez modifier localement. Child est le nouveau type qui tente d'implémenter cette modification.
Méthode 1 - Définition du type
Méthode 2 - Intégration ( documentation officielle )
Résumé
Vous pouvez voir cela dans le code suivant.
exemple de travail sur l'aire de jeux
la source