l'éditeur php Strawberry vous présentera un problème concernant l'analyse JSON. Parfois, nous rencontrons une situation dans laquelle l'utilisation de json.Unmarshal pour analyser les données d'un fichier est efficace, mais l'utilisation de json.NewDecoder().Decode() n'est pas efficace. Ce problème peut survenir dans la logique du code ou dans le format des données. Ci-dessous, nous analyserons en détail les causes possibles et proposerons des solutions.
Ce qui suit désorganise correctement la structure :
func foo() { d, err := os.readfile("file.json") var t t if err := json.unmarshal(d, &t); err != nil { panic(err) } }
Mais cela ne fonctionne pas et génère un tas d'erreurs d'analyse json classiques, eof
、unexpected token 't'
etc.
func foo() { f, err := os.open("file.json") var t t if err := json.newdecoder(f).decode(&t); err != nil { panic(err) } }
Savez-vous pourquoi ? os.file
或 []byte
Utilisée dans deux goroutines en même temps, la structure json est la suivante (certains champs sont omis) :
{ "data": [ { "field": "stuff", "num": 123, }, ... ] }
os.File
或 []byte
Utiliser dans deux goroutines en même temps...
C'est ça le problème. os.File
Il existe un pointeur de fichier interne où se produit la prochaine lecture. Si deux entités non liées continuent à lire des données, elles ne peuvent pas lire les données qui se chevauchent. Les octets lus par la première entité ne sont pas répétés dans la seconde entité.
De plus, os.File
n'est pas sûr pour une utilisation simultanée (la documentation n'indique pas explicitement qu'il est sûr) : appeler ses méthodes à partir de plusieurs goroutines simultanées peut provoquer des courses de données.
Lorsque vous transmettez []byte
à plusieurs fonctions/goroutines qui « lisent depuis », il n'y a pas de pointeurs partagés ni de variables d'index. Chaque fonction/goroutine conservera son index séparément, et il est possible de lire les variables de plusieurs goroutines (dans ce cas, les champs de l'en-tête de tranche et des éléments de tranche).
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!