Quiero agregar un método de utilidad conveniente a los gorilla/mux
tipos de ruta y enrutador:
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)
}
pero el compilador me informa
No se pueden definir nuevos métodos en mux de tipo no local.
Entonces, ¿cómo podría lograr esto? ¿Creo un nuevo tipo de estructura que tiene un campo anónimo mux.Route y mux.Router? ¿O algo mas?
go
extension-methods
Daniel Robinson
fuente
fuente
“extension methods are not object-oriented”
) para C #, pero al mirarlos hoy, inmediatamente me acordé de las interfaces de Go (y su enfoque para repensar la orientación a objetos), y luego tuve esta misma pregunta.Respuestas:
Como menciona el compilador, no puede extender los tipos existentes en otro paquete. Puede definir su propio alias o subpaquete de la siguiente manera:
o incrustando el enrutador original:
fuente
mux.Router
instancias aMyRouter
s? por ejemplo, si tiene una biblioteca que regresamux.Router
pero quiere usar sus nuevos métodos?Quería ampliar la respuesta dada por @jimt aquí . Esa respuesta es correcta y me ayudó enormemente a resolver esto. Sin embargo, hay algunas advertencias a ambos métodos (alias, incrustar) con las que tuve problemas.
nota : uso los términos padre e hijo, aunque no estoy seguro de que sea el mejor para la composición. Básicamente, padre es el tipo que desea modificar localmente. Hijo es el nuevo tipo que intenta implementar esa modificación.
Método 1 - Definición de tipo
Método 2: incrustación ( documentación oficial )
Resumen
Puedes ver esto en el siguiente código.
ejemplo de trabajo en el patio de recreo
fuente