ホームページ >バックエンド開発 >Golang >Go で派生インターフェイス型の `reflect.Kind` を決定する方法は?

Go で派生インターフェイス型の `reflect.Kind` を決定する方法は?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-02 12:34:40329ブラウズ

How to Determine the `reflect.Kind` of a Derived Interface Type in Go?

Go での派生インターフェイス型の種類の決定

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 という文字列型があります。ただし、id 型の実装には id 文字列型が使用されます。目標は、id 変数からreflect.Kindをreflect.Interfaceとして取得することです。

解決策

この問題を解決する鍵は、リフレクションがインターフェースをどのように処理するかを理解することにあります。価値観。値をreflect.TypeOf()に渡すと、その値は自動的にインターフェースでラップされます。{}ただし、型情報を保持するには、インターフェイスへのポインターを使用する必要があります。

ID インターフェイスへのポインターを定義し、それをreflect.TypeOf() に渡すことで、Elem( を使用して型記述子を取得できます。 ) インターフェイス型の実際の型記述子にアクセスします。

コード例

次のコード スニペットは解決策を示しています:

id := ID(id("test"))

fmt.Println(id)
t := reflect.TypeOf(&id).Elem()
fmt.Println(t)

fmt.Println(t.Kind())

このコードは次の出力を行います:

test
main.ID
interface

この手法を利用することで、次のことを正確に判断できます。派生インターフェイス タイプのreflect.Kindを確認し、その基礎となる実装の詳細を明らかにします。

以上がGo で派生インターフェイス型の `reflect.Kind` を決定する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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