ホームページ >バックエンド開発 >Golang >Goでインターフェイスを実装するプリミティブ型の正しいreflect.Kindを取得する方法?

Goでインターフェイスを実装するプリミティブ型の正しいreflect.Kindを取得する方法?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-17 04:58:24412ブラウズ

How to Get the Correct reflect.Kind of a Primitive Type Implementing an Interface in Go?

プリミティブ型に基づいた型の種類を取得します

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

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