非マーシャリング データを使用した型アサーション
分散システムでは、データは多くの場合 JSON 文字列として交換されます。メッセージ キューから JSON データを取得する場合、データをインターフェースに逆シリアル化し、型アサーションを実行してデータの実際の構造体の型を決定する必要があるシナリオが発生する場合があります。
問題
受信した JSON 文字列をインターフェースにアンマーシャリングし、結果を型アサートしようとすると、予期しないエラーが発生する可能性があります。{} 結果。予想される構造体タイプの代わりに、map[string]interface{} を取得します。
Solution
JSON をインターフェースにアンマーシャリングするデフォルトの動作により、タイプが得られます。{} bool、float64、string、[]interface{}、map[string]interface{} など。 Something1 と Something2 はカスタム構造体であるため、JSON アンマーシャラーによって認識されません。
これを解決するには、主に 2 つのアプローチがあります。
1.カスタム構造体への直接アンマーシャル
コード:
var input Something1 json.Unmarshal([]byte(msg), &input) // Type assertions and processing can be performed here var input Something2 json.Unmarshal([]byte(msg), &input) // Type assertions and processing can be performed here
2.マップ インターフェイスから展開
コード:
var input interface{} json.Unmarshal([]byte(msg), &input) // Unpack the data from the map switch v := input.(type) { case map[string]interface{}: // Extract the data from the map and assign it to custom structs }
高度なアプローチ
より汎用性の高いソリューションについては、アンマーシャリングと型アサーションを処理する「Unpacker」構造体の作成を検討してください。 process.
コード:
type Unpacker struct { Data interface{} } func (u *Unpacker) UnmarshalJSON(b []byte) error { smth1 := &Something1{} err := json.Unmarshal(b, smth1) if err == nil && smth1.Thing != "" { u.Data = smth1 return nil } smth2 := &Something2{} err = json.Unmarshal(b, smth2) if err != nil { return err } u.Data = smth2 return nil }
結論
これらのアプローチのいずれかを使用すると、type を正常に実行できます。最初に JSON 文字列からインターフェースにアンマーシャリングされるデータのアサーション。{}どのアプローチを選択するかは、アプリケーションの特定の要件によって異なります。
以上がGo で非マーシャリングされた JSON データに対して型アサーションを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。