インターフェースでreflect.NewAtを使用するにはどうすればよいですか?{}

WBOY
リリース: 2024-02-09 14:00:24
転載
922 人が閲覧しました

インターフェースでreflect.NewAtを使用するにはどうすればよいですか?{}

php エディタ Xinyi では、インターフェースでの Reflect.NewAt の使用方法を紹介しています。{} reflect.NewAt は Go 言語のリフレクション ライブラリ関数であり、指定されたインターフェイス タイプで新しいインスタンスを作成するために使用されます。 Reflect.NewAt を使用すると、コンパイル時に特定の型を指定せずに、新しいインターフェイス インスタンスを動的に作成して初期化できます。これにより、柔軟性とダイナミクスが向上し、コードの多用途性と拡張性が向上します。以下では、reflect.NewAt を使用して、interface{} にインスタンスを作成する方法について詳しく説明します。

質問内容

package main

import (
    "encoding/json"
    "fmt"
    "reflect"
    "unsafe"
)

type Stu struct {
    Name string `json:"name"`
}

func MakeStu() interface{} {
    return Stu{
        Name: "Test",
    }
}

func main() {
    jsonData := []byte(`{"name":"New"}`)
    t1 := MakeStu()
    t2 := MakeStu()
    t3 := MakeStu()

    json.Unmarshal(jsonData, &t1)
    fmt.Println(t1) //Type of t1 becomes map[string]interface{} instead of struct Stu

    newPointer := reflect.New(reflect.ValueOf(t2).Type()).Interface()
    json.Unmarshal(jsonData, newPointer)
    fmt.Println(newPointer) //It works,but it need allocate memory to hold temp new variable

    brokenPointer := reflect.NewAt(reflect.ValueOf(t3).Type(), unsafe.Pointer(&t3)).Interface()
    json.Unmarshal(jsonData, brokenPointer)
    fmt.Println(brokenPointer) // I want to get the pointer of original type based on the existed variable t3,but it crashes.
}
ログイン後にコピー

コーディング時にインターフェースの特定のタイプがわからない場合、interface.(type) を使用してキャストすることはできません。{} では、interface{} でreflect.newatを使用するにはどうすればよいでしょうか?

interface{} を返すメソッドを含むインターフェイスがある場合、その具体的な型は struct ですが、コーディング時に struct の型を判断できません。 jsonでエンコードされたデータをデコードするには、json.unmarshalを使用する必要があります。 map[string]interface{} を取得したくないので、レシーバーの型を具体的な型のインターフェースへのポインタに設定する必要があります。{} 。 Reflect.new の使用は簡単ですが、余分なメモリを消費するため、既存のインターフェースで Reflect.newat を使用する方法に興味があります。{}

解決策

この問題について少し説明したいと思います。

制御できない関数 makestu() 具象型ではなく、空のインターフェイスを返します。これにより、具象型が json.unmarshal() に対して「非表示」になり、json.unmarshal() が具象型 stu# ではなく空のインターフェイスとして扱われます。 #。何らかの方法で具体的な型をアンマーシャラーに伝える必要があります。

この問題は、タイプ スイッチを使用して解決します。

リーリー

型スイッチは空のインターフェイスを具象型に変換し、

json.unmarshal() はそれを具象型として扱います。まだ追加の割り当てがある可能性がありますが、コードは読みやすくなり、リフレクションに依存しなくなります。

本当に冒険してみたい場合は、次のように、空のインターフェイスへのポインターを受け入れるヘルパー関数を追加します。 リーリー

これにより、次のような使用法が可能になります:

リーリー

これは私にはきれいに見え、リフレクションは含まれていませんが、あなた自身が提案したように

reflect.newat()

を使用しません。私のアドバイスが今でも役立つことを願っています。

以上がインターフェースでreflect.NewAtを使用するにはどうすればよいですか?{}の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!