Go では、外部パッケージで定義された既存の型の拡張は直接サポートされていません。ただし、同様の結果を達成するための回避策があります。
質問に示されている例を考えてみましょう:
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 の新しいメソッド。これは、Go では外部パッケージからの型の直接拡張が許可されていないためです。
回避策 1: ラッパー型を定義する
1 つの回避策は、以下を埋め込むラッパー構造体を定義することです。元の型を復元し、必要なメソッドを提供します。例:
type MyRoute struct { *mux.Route } func (r *MyRoute) Subroute(tpl string, h http.Handler) *mux.Route { return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) } type MyRouter struct { *mux.Router } func (r *MyRouter) Subroute(tpl string, h http.Handler) *mux.Route { return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) }
回避策 2: 型アサーション
別のオプションは、型アサーションを使用して元の型をインターフェースに変換し、その後インターフェイスに変換することです。{}必要なメソッドを提供するカスタム タイプ。例:
func (r interface{}) Subroute(tpl string, h http.Handler) *mux.Route { switch v := r.(type) { case *mux.Route: return v.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) case *mux.Router: return v.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) default: panic("unreachable") } }
注: これらの回避策はさらに複雑になる可能性があるため、慎重に使用する必要があります。可能であれば、外部型の変更を避け、代わりに必要な機能をラップまたは拡張する独自の型を定義することが最善です。
以上が直接拡張がサポートされていない場合、Go で既存の型を拡張するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。