プリミティブ型に基づいた型のreflect.Kindの取得
Goでは、型のreflect.Kindを決定するのは難しい場合があります型がプリミティブ型に基づいたインターフェイスを実装する場合。たとえば、次のシナリオを考えてみましょう。
type ID interface { myid() } type id string func (id) myid() {} func main() { id := ID(id("test")) fmt.Println(id) fmt.Println(reflect.TypeOf(id)) // How to get the kind to return "reflect.Interface" from the var "id"? fmt.Println(reflect.TypeOf(id).Kind()) }
この例では、ID インターフェイスは、プリミティブ文字列型に基づく id 型によって実装されます。我々はreflect.TypeOf(id).Kind()がreflect.Interfaceを返すようにしたいのですが、代わりにreflect.String.
Solution using Pointer to Interface
Toを返します。この問題を解決するには、reflect.TypeOf() がインターフェースを想定していることを覚えておく必要があります。{}非インターフェース値を操作する場合、Go はそれらの値を自動的に暗黙的にインターフェースにラップします。{}これを回避するには、インターフェイスへのポインターを使用できます。
t := reflect.TypeOf(&id).Elem() fmt.Println(t.Kind())
reflect.TypeOf(&id).Elem() を使用して、ID インターフェイスの型記述子を取得します。これが、私たちの正体です。 Elem() メソッドは、インターフェイス型であるポインター型の要素型を提供します。
更新されたコードを実行すると、出力:
test main.ID interface
これは、プリミティブ型に基づいてインターフェイスを実装する型の Reflect.Kind を正しく取得する方法を示します。
以上がGo でプリミティブ型に基づいてインターフェイスを実装する型の `reflect.Kind.Interface` を取得する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。