他のパッケージで定義されている既存の型に機能を拡張することは、ソフトウェア開発における一般的な要件です。 Go では、型がローカルまたは非ローカルに分類されるため、非ローカル型に新しいメソッドを追加するのは困難な場合があります。この記事では、この目的を達成するためのさまざまなアプローチを検討します。
提供されたコード スニペットは、github.com/0xor1/gorillaseed から Route および Router タイプにユーティリティ メソッドを追加する試みを示しています。 /src/server/lib/mux パッケージ。ただし、コンパイラは、非ローカル型での新しいメソッドの定義が許可されていないことを示すエラーを報告します。
この制限を克服するために、Go はいくつかの手法を提供しています。
1.匿名フィールドを使用した新しい構造体の定義
1 つのアプローチは、元の型を匿名フィールドとして埋め込む新しい構造体型を作成することです。例:
type MyRoute struct { *mux.Route }
これにより、mux.Route フィールドへのアクセスを継承するカスタム メソッドを MyRoute に定義できます。
2.元の型の埋め込み
または、新しい構造体型内に元の型を明示的に埋め込むこともできます。
type MyRouter struct { mux.Router }
このアプローチでは、継承関係のより明示的な定義が提供されます。埋め込み型の機能を拡張することもできます。
3.元の型のラップ
もう 1 つのオプションは、基礎となる機能を元の型に委任しながら、必要なメソッドを実装するラッパー型を作成することです。例:
type MyRouter struct { Router mux.Router } func (r *MyRouter) F() { // Do something r.Router.G() }
このアプローチは柔軟性を提供し、元の機能を活用しながら、ラップされた型の動作をカスタマイズできます。
非拡張Go のローカル型では、構造体の埋め込み型またはラッパー型を賢く使用する必要があります。これらのテクニックを活用することで、Go 言語のカプセル化原則に違反することなく、カスタム機能で既存の型を強化できます。
以上がGo で非ローカル型の機能を拡張するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。