Я хочу добавить удобный метод использования для gorilla/mux
типов Route и Router:
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)
}
но компилятор сообщает мне
Невозможно определить новые методы для мультиплексора нелокального типа.
Итак, как мне этого добиться? Могу ли я создать новый тип структуры с анонимными полями mux.Route и mux.Router? Или что-то другое?
go
extension-methods
Дэниел Робинсон
источник
источник
“extension methods are not object-oriented”
) для C #, но, глядя на них сегодня, я сразу вспомнил интерфейсы Go (и его подход к переосмыслению объектной ориентации), и тогда у меня возник именно этот вопрос.Ответы:
Как упоминает компилятор, вы не можете расширять существующие типы в другом пакете. Вы можете определить свой собственный псевдоним или подпакет следующим образом:
или встроив оригинальный роутер:
источник
mux.Router
экземпляры кMyRouter
s? например, если у вас есть библиотека, которая возвращается,mux.Router
но вы хотите использовать свои новые методы?Я хотел расширить ответ, данный @jimt здесь . Этот ответ верен и очень помог мне разобраться в этом. Однако есть некоторые предостережения в отношении обоих методов (псевдоним, встраивание), с которыми у меня возникли проблемы.
примечание : я использую термины родительский и дочерний, хотя я не уверен, что это лучший вариант для композиции. По сути, parent - это тип, который вы хотите изменить локально. Дочерний - это новый тип, который пытается реализовать эту модификацию.
Метод 1 - определение типа
Метод 2 - Встраивание ( официальная документация )
Резюме
Вы можете увидеть это в следующем коде.
рабочий пример на детской площадке
источник