1. ホーム
  2. go

[解決済み] Goで既存の型に新しいメソッドを追加するには?

2022-04-23 12:07:21

質問

に便利なutilメソッドを追加したい。 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.Router

では、どうすれば実現できるのでしょうか?匿名の mux.Route と mux.Router フィールドを持つ新しい struct タイプを作成しますか?または何か他のもの?

どのように解決するのですか?

コンパイラが言及しているように、他のパッケージの既存の型を拡張することはできません。以下のように、独自のエイリアスやサブパッケージを定義することができます。

type MyRouter mux.Router

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

または、オリジナルのルータを埋め込むことで実現できます。

type MyRouter struct {
    *mux.Router
}

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

...
r := &MyRouter{router}
r.F()