ホームページ > バックエンド開発 > Golang > 直接拡張がサポートされていない場合、Go で既存の型を拡張するにはどうすればよいですか?

直接拡張がサポートされていない場合、Go で既存の型を拡張するにはどうすればよいですか?

DDD
リリース: 2024-12-13 18:24:14
オリジナル
335 人が閲覧しました

How Can I Extend Existing Types in Go When Direct Extension Is Not Supported?

Go での既存の型の拡張

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート