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