メソッド パラメータの名前の取得
Go メソッドを使用する場合、特定のパラメータの名前を取得することが望ましい場合があります。たとえば、次のメソッドの場合:
func (t *T) TMethod(data *testData) (interface{}, *error) { ... }
はパラメーター データの名前を取得します。ただし、次のリフレクション コードを使用すると、構造体名 testData が返されます:
reflect.ValueOf(T).MethodByName("TMethod").Type.In(0).Elem().Name()
パラメーター名を取得できないのはなぜですか?
実際、Go 言語では関数やメソッドのパラメータの名前を取得する方法はありません。これは、呼び出し元にとってパラメーターの名前は重要ではないためです。重要なのはパラメータのタイプと順序だけです。
関数型は、同じパラメーターと結果型を持つすべての関数のコレクションを表します。 2 つの関数のパラメーターと結果の型が同じ場合、パラメーターの名前に関係なく、それらの型は同じになります。次のコードは true を出力します:
func f1(a int) {} func f2(b int) {} fmt.Println(reflect.TypeOf(f1) == reflect.TypeOf(f2))
パラメータ名を指定しない関数またはメソッドを作成することも可能です (パラメータまたは結果リストに名前がすべて存在するか、まったく存在しない)。次のコードは機能します:
func NamelessParams(int, string) { fmt.Println("NamelessParams called") }
回避策
受信 API パラメーターを Go 関数/メソッド パラメーターにマップする名前付きパラメーター フレームワークを作成したい場合は、次のようにすることができます。構造体を使用します。これは、reflect パッケージ (Value.FieldByName() や Type.FieldByName() など) を使用して名前付きフィールドを取得したり、マップを使用したりできるためです。次の関連質問を参照してください:
関数フィールドの初期化
詳細と例については、Google メーリング リストの関連記事を参照してください:
Go に名前のない引数は true ですか?
以上がリフレクションを使用して Go メソッドのパラメータの名前を取得できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。