一尘不染

如何向 Go 中的现有类型添加新方法?

go

我想在gorilla/muxRoute 和 Router 类型上添加一个方便的 util 方法:

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.Router 上定义新方法

那么我将如何实现这一目标?我是否创建了一个具有匿名 mux.Route 和 mux.Router 字段的新结构类型?或者是其他东西?


阅读 192

收藏
2021-11-08

共1个答案

一尘不染

正如编译器所提到的,您不能在另一个包中扩展现有类型。您可以定义自己的别名或子包,如下所示:

type MyRouter mux.Router

func (m *MyRouter) F() { ... }

或者通过嵌入原始路由器:

type MyRouter struct {
    *mux.Router
}

func (m *MyRouter) F() { ... }

...
r := &MyRouter{router}
r.F()
2021-11-08