Désorganisation des types d'interface
L'un des défis des packages RPC et JSON de Go est la désorganisation des types d'interface. Examinons ce problème et explorons sa solution.
Le problème
Lorsque nous essayons de désorganiser un type d'interface, nous rencontrons des erreurs telles que "json : impossible de désorganiser l'objet dans Go valeur de type main.Foo." Cela se produit parce que le réflecteur ne peut pas déterminer le type concret approprié à instancier pour les données marshalées entrantes.
La solution
Le problème vient du manque d'informations de type disponibles pour le réflecteur lors du déclassement. Par exemple, bien que le marshalling soit possible à partir de variables de type d'interface, le démarshalling n'est pas dû à l'incapacité du réflecteur à identifier le type concret correspondant.
Pour résoudre ce problème, des frameworks comme Json de Java (jackson) utilisent des annotations pour fournir des tapez des informations. Cependant, dans Go, nous pouvons implémenter l'interface Unmarshaler pour les types personnalisés afin de gérer nous-mêmes le processus de démarshalling.
Implémentation d'Unmarshaler
Voici un exemple d'implémentation de l'interface Unmarshaler pour notre type personnalisé RawString :
type RawString string func (m *RawString) MarshalJSON() ([]byte, error) { return []byte(*m), nil } func (m *RawString) UnmarshalJSON(data []byte) error { *m += RawString(data) return nil }
Maintenant, nous pouvons désassembler les données JSON dans une instance RawString :
const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}` type A struct { I int64 S RawString `sql:"type:json"` } func main() { a := A{} if err := json.Unmarshal([]byte(data), &a); err != nil { log.Fatal("Unmarshal failed", err) } fmt.Println("Done", a) }
En fournissant l'implémentation Unmarshaler pour notre type personnalisé, nous pouvons désassembler les données JSON sans rencontrer l'erreur susmentionnée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!