Go では、reflect.MakeFunc 関数を使用して関数を動的に作成できます。しかし、この機能を拡張して、実行時にメソッド (レシーバーを持つ関数) を作成することはできますか?
答え:
いいえ、Go ではメソッドを直接作成することはできません。ダイナミックに。これは、Go の型チェックがコンパイル中に行われ、実行時に型がメソッドを獲得したり失ったりする可能性がある場合、関数呼び出しのすべてのインターフェイス引数に対してインターフェイス実装チェックが必要になるという事実に由来しています。
可能性回避策:
実際のメソッドを動的に作成することは不可能ですが、アタッチされたメソッドを表す値を構築することは可能です。任意のタイプに。これには、reflect パッケージのコードの変更が含まれます。ただし、これは Go の型システムの回避であり、実際にはその型のメソッド セットを変更するわけではないことに注意してください。
オブジェクト メソッド スワッピング:
もう 1 つの方法は、オブジェクトのメソッド ポインタを交換することです。 Java などの言語とは異なり、Go は仮想メソッド ディスパッチ テーブルを具体的な値に埋め込まず、インターフェイス値にのみ埋め込みます。 reflect.nonEmptyInterface を取得し、その itable フィールドを変更することで、オブジェクトのメソッドの動作を動的に変更できます。
以上がGo は実行時にメソッドを動的に作成できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。