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