ホームページ >バックエンド開発 >Golang >リフレクションを使用して Go メソッドのパラメータの名前を取得できないのはなぜですか?

リフレクションを使用して Go メソッドのパラメータの名前を取得できないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-22 08:37:09977ブラウズ

Why Can't I Get the Name of a Go Method Parameter Using Reflection?

メソッド パラメータの名前の取得

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。