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

Go でプリミティブ型に基づいてインターフェイスを実装する型の `reflect.Kind.Interface` を取得する方法は?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-31 05:30:12604ブラウズ

How to Retrieve `reflect.Kind.Interface` for a Type Implementing an Interface Based on a Primitive Type in Go?

プリミティブ型に基づいた型の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 サイトの他の関連記事を参照してください。

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