ホームページ  >  記事  >  バックエンド開発  >  Go - メソッドのポインタ レシーバを持つ型のみによってインターフェイスが満たされるように強制しますか?

Go - メソッドのポインタ レシーバを持つ型のみによってインターフェイスが満たされるように強制しますか?

PHPz
PHPz転載
2024-02-10 09:27:201163ブラウズ

Go - 强制接口仅由方法上带有指针接收器的类型满足?

php エディタ Baicao は、Go 言語の必須インターフェイス ルールを紹介します。つまり、メソッドにポインター レシーバーを持つ型のみがインターフェイスの要件を満たすことができます。 Go 言語は、インターフェイスを通じてポリモーフィズムを実装する静的型付けプログラミング言語です。インターフェイスを定義するときに、メソッドのレシーバーの型 (値の型またはポインターの型) を指定できます。ただし、必須インターフェイス ルールを使用すると、メソッドにポインター レシーバーを持つ型のみがインターフェイスの要件を満たすことができます。これは、ポインター型は値の内容を変更できるが、値型は変更できないためです。このルールにより、インターフェイス メソッドが値を操作するときに予期しない動作が発生しないことが保証されます。このルールを理解することで、Go 言語でのインターフェイスの使用と設計をより深く理解できるようになります。

質問の内容

構造体を連結して json http リクエストに対する応答を生成する一般的な方法を見つけるために、型パラメーターを使用していくつかの実験を行っています。

構造体が実装する必要がある method インターフェイスには、setparams メソッドがあります。実装でポインター レシーバーが使用されている限り、これは期待どおりに機能します。

私の質問: setparams に値レシーバーがある場合、それをコンパイル時エラーにする方法はありますか?

次の例は、値レシーバーを使用した setparams の問題を示しています。 リーリー

https://go.dev/play/p/eii8adkmdxe

解決策

これはできません。

コード内で次のことを行う場合:

リーリー

t の型セットには型項目として *m しか含まれていませんが、m には *m のメソッド セットも含まれています。 宣言されたメソッド。コンパイラは、 このメソッド *m のメソッド セットにどのように表示されるかを確認できません。

メソッド

setparambadping で宣言する場合、メソッドが受信側を無駄に変更しようとしないようにするのはユーザーの責任です。

以上がGo - メソッドのポインタ レシーバを持つ型のみによってインターフェイスが満たされるように強制しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。