プリミティブ型に基づいた型の種類を取得します
Go では、reflect パッケージを使用して構造を検査できます型と値の。ただし、インターフェイスを実装しているがプリミティブ型に基づいている型の Reflect.Kind を決定するのは困難な場合があります。
次の例を考えてみましょう。
type ID interface { myid() } type id string func (id) myid() {}
ここでは、ID 型がID インターフェイスを実装しますが、その実装はプリミティブ型の文字列に基づいています。 Reflect.TypeOf(id).Kind() を使用して Reflect.Kind の ID を取得しようとすると、reflect.Interface の代わりに Reflect.String が返されます。
この問題を解決するには、次のように渡す必要があります。値自体ではなく、インターフェイス値へのポインタ。その理由は、reflect.TypeOf() はインターフェース値を想定していますが、インターフェース以外の値が渡された場合、その値は暗黙的にインターフェースにラップされるためです。
次に例を示します:
id := ID(id("test")) fmt.Println(id) t := reflect.TypeOf(&id).Elem() fmt.Println(t) fmt.Println(t.Kind())
出力は次のとおりです。
test main.ID interface
この場合、reflect.TypeOf(&id) は、インターフェイス値。その後、 t :=reflect.TypeOf(&id).Elem() を使用して「ラップ解除」されます。結果の t は ID インターフェイスの型記述子であり、その Kind() メソッドはreflect.Interfaceを返します。
このアプローチは、呼び出し時にreflect.Interfacesを返す任意の型のreflect.Kindを取得するために使用できます。 Kind()。プリミティブ型に基づいている場合でも。
以上がGoでインターフェイスを実装するプリミティブ型の正しいreflect.Kindを取得する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。