Quero adicionar um método utilitário de conveniência aos gorilla/mux
tipos de roteador e roteador:
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)
}
mas o compilador me informa
Não é possível definir novos métodos no mux do tipo não local.
Então, como eu conseguiria isso? Crio um novo tipo de estrutura que possui um campo anônimo mux.Route e mux.Router? Ou alguma outra coisa?
go
extension-methods
Daniel Robinson
fonte
fonte
“extension methods are not object-oriented”
) para C #, mas, ao analisá-los hoje, fui imediatamente lembrado das interfaces do Go (e sua abordagem para repensar a orientação a objetos), e então tive essa pergunta.Respostas:
Como o compilador menciona, você não pode estender os tipos existentes em outro pacote. Você pode definir seu próprio alias ou subpacote da seguinte maneira:
ou incorporando o roteador original:
fonte
mux.Router
instâncias aMyRouter
s? por exemplo, se você tem uma biblioteca que retorna,mux.Router
mas deseja usar seus novos métodos?Eu queria expandir a resposta dada por @jimt aqui . Essa resposta está correta e me ajudou tremendamente a resolver isso. No entanto, existem algumas ressalvas nos dois métodos (alias, incorporar) com os quais tive problemas.
nota : eu uso os termos pai e filho, embora não tenha certeza de que seja o melhor para composição. Basicamente, pai é o tipo que você deseja modificar localmente. Filho é o novo tipo que tenta implementar essa modificação.
Método 1 - Definição de tipo
Método 2 - Incorporação ( documentação oficial )
Resumo
Você pode ver isso no código a seguir.
exemplo de trabalho no parquinho
fonte