Go: メソッドの引数の型が受信者の型と同じである型制約を指定する方法
Go 言語では、型制約を使用して関数またはメソッドのパラメーターの型を指定できます。メソッドのパラメーターの型をレシーバーの型と同じにしたい場合、どのように指定すればよいでしょうか?まず第一に、Go 言語はパラメーターの型がレシーバーの型と同じであるという機能を直接サポートしていないことを明確にする必要があります。ただし、メソッド定義でポインター型を使用すると、同様の効果を実現できます。次に、Go 言語でパラメーターの型をレシーバーの型と同じに指定する方法を詳しく説明します。
質問内容
以下のような型制約を指定したいのですが:
リーリー ただし、以下に示すように、実装型がインターフェイス Comparer
ではなくメソッド Compare
に独自の具象型を渡すようにしたいと考えています (以下は を実装していないことはわかっています)比較子
):
次のような汎用インターフェイスを使用してみます:
リーリーしかし、これはメソッド Compare
のレシーバーも型 T であることを強制しません。
メソッド Compare
のレシーバーの型とパラメーターの型を強制的に同じにする方法はありますか?
回避策
制約について話すときは、基本的に、型パラメータのセットに対する制限として、インターフェイス型の特定の使用法を指します。
したがって、インターフェースを(正しく)次のように定義すると:
リーリーあなたは半分しか話していません。実際、上記は制限ではありません。それは単なるインターフェースです。
本当に型制約となるためには、インターフェイス を として使用する必要があります。
リーリー型パラメーター リスト内でのみ、型パラメーターを使用して制約をインスタンス化することで、Compare(T)
のレシーバーを T
自体にすることができます。
制約として使用しない場合、インターフェースは単にメソッドのセットの定義であり、 設計により 実装できる型に制限はありません。
型用語を使用して、どの型が特定のインターフェイスを実装する必要があるかを指定できるようになりました。ただし、型パラメーターを型用語として直接使用することはできません。 T
:
これにより、*MyInt
などのポインタ レシーバでメソッドを宣言する必要が生じることに注意してください。これは理想的な場合とそうでない場合があります。
関係なく、T
が何であるかに関係なく、制約によって追加レベルのポインター間接参照が課されるため、これを独自の型パラメーターを使用して T Comparer[T]
としてインスタンス化することはできません。関数のパラメータは決してそれを満たしません。
この機能を実装するコツは、さまざまな型パラメーターを使用して Comparer
をインスタンス化することです。
そしてメソッドを次のように宣言します:
リーリーただし、予想どおりインターフェイス制約を使用すれば、この複雑な回避策は完全に不要になります。
遊び場https://www.php.cn/link/3ea816621e0d8ecd5e534ec28051d4d5
以上がGo: メソッドの引数の型が受信者の型と同じである型制約を指定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...
