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

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

Patricia Arquette
リリース: 2024-12-17 04:58:24
オリジナル
387 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート