この記事では、型パラメーターなしでジェネリック構造体の型名を取得する方法をphpエディターのいちごが紹介します。ジェネリックは、特定の型を指定せずに汎用コードを作成できる強力なプログラミング手法です。ただし、特定の型パラメーターを含まずにジェネリック構造体の型名を取得する必要がある場合があります。この記事では、この質問に詳しく答え、一般的なプログラミングをよりよく理解して適用するのに役立ちます。
foo
という汎用構造体があり、そこから 2 つのオブジェクトを作成するとします。次のように reflect.typeof()
を使用して、それぞれの具体的な型を決定できます。
リーリー
foo[string] と
foo[int) ではなく、一般的な型 (つまり、foo
) を決定することに興味があります。 ])。これは可能ですか、それともこれらの文字列から (正規表現を使用して) 手動でジェネリック型を抽出する必要がありますか?
###編集###
foo
)。回避策基本型が実行時に存在しないため、リフレクションは「基本」ジェネリック型の名前を認識できません。
go 仕様の関連する段落は
Instantiation
新しい非ジェネリックの名前付き型
が生成され、関数をインスタンス化すると、新しい非ジェネリック関数が生成されます。だから、次のように書くと: リーリー
この型の名前は正確にはfoo[int] です。
型パラメーター リストのない識別子
foo は、同じパッケージ内で再宣言できないため、コンパイル時に関連することに注意してください。
型定義
型定義により、同じ型を持つ新しい異なる型が作成されます
基礎となる型と操作は、型と境界として指定されます。
識別子、タイプ名、 を付けます。
リーリー
ただし、上で述べたように、インスタンス化の結果、foo とは異なる新しい名前付き型が生成されます。実行時には、リフレクションを使用できる場合にのみインスタンス化を処理します。
結論として、いくつかのヘルパー関数が (存在する場合) stdlib に追加されるまでは、 あなたの正規表現ソリューション
は受け入れられると思います。わかりやすくするためにここに再投稿します:
リーリー
type.string()
type.name() の違いを覚えておいてください。どの型も文字列表現を持つことができますが、名前を付けることができるのは名前付き型だけです。 (当然ですよね?)たとえば、次のように書いた場合: リーリー
この場合、b の型は
*foo[int] であり、これは匿名の複合型であり、
name()
以上が型パラメータを持たないジェネリック構造体の型名を取得します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。