Échec de conversion d'interface lors de la désérialisation JSON
Lorsque vous tentez de désérialiser des structures de données complexes à partir de JSON, il est crucial d'assurer une gestion appropriée des interfaces pour éviter erreurs d'exécution. Considérez le code suivant :
type Data struct { Content string Links []string } func main() { anInterface := interface{}{/* JSON data here */} // Assertion to Data interface AData2 := anInterface.(Data) }
Lors de l'exécution, le programme renvoie une erreur :
panic: interface conversion: interface {} is map[string]interface {}, not main.Data
Comprendre le problème
L'erreur provient de la tentative d'assertion d'une interface contenant une carte de paires chaîne-interface directement dans une structure Data. Go s'attend à ce que l'interface contienne une valeur Data, mais le contenu réel est une carte.
Solution
Pour résoudre ce problème, il est essentiel de comprendre la nature des interfaces . Une interface est simplement un contrat qui définit un ensemble de méthodes qu'un type doit implémenter. Pour affirmer une interface sur un type spécifique, l'interface doit avoir été préalablement renseignée avec la valeur de ce type.
Dans ce cas, les modifications suivantes doivent être apportées :
anInterface = Data{Content: "hello world", Links: []string{"link1", "link2", "link3"}}
AData2 = anInterface.(Data)
Cela garantit que l'interface contient le type correct avant de tenter de convertissez-le en données.
Approche alternative
Une autre approche consiste à désassembler directement les données JSON dans la structure de données souhaitée :
var AData2 Data err := json.Unmarshal([]byte(jsonStr), &AData2) if err != nil { panic(err) }
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!