Go では、reflect.MakeFunc 関数を使用して関数を動的に作成できます。ただし、メソッド (レシーバーを備えた関数) を使用する場合、当然の疑問が生じます: 実行時にメソッドを作成することは可能ですか?
答えは いいえです。この制限は、Go の型システムの動作方法に起因します。 Go はコンパイル時に型チェックを実行します。型のメソッド セットが動的に変更されると、インターフェイス引数を含む関数呼び出しごとに実行時のインターフェイス実装チェックが必要になります。
それでも、回避策は存在します。リフレクト パッケージをフォークすることにより、特定の型にアタッチされたメソッドを表す値を作成できます。このアプローチは型のメソッド セットを変更しませんが、実行時にメソッド作成をエミュレートする方法を提供します。
あるいは、オブジェクトのメソッド ポインターを交換することもできます。 Java とは異なり、Go は具体的な値で仮想メソッド ディスパッチ テーブルを使用しません。ただし、reflect.nonEmptyInterface 値の itab フィールドを操作することで、そのオブジェクトのメソッド呼び出しを効果的に再配線できます。
以上がGo は実行時にメソッドを動的に作成できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。