インターフェースで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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

SQL.Openを使用する場合、DSNがエラーを報告しないのはなぜですか? GO言語では、sql.open ...
