Maison > développement back-end > Golang > Les données du fichier json.Unmarshal sont valides, mais json.NewDecoder().Decode() n'est pas valide

Les données du fichier json.Unmarshal sont valides, mais json.NewDecoder().Decode() n'est pas valide

WBOY
Libérer: 2024-02-09 12:15:31
avant
847 Les gens l'ont consulté

json.Unmarshal 文件数据有效,但 json.NewDecoder().Decode() 无效

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.

Contenu de la question

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)
  }
}
Copier après la connexion

Mais cela ne fonctionne pas et génère un tas d'erreurs d'analyse json classiques, eofunexpected 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)
  }
}
Copier après la connexion

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,
    },
    ...
  ]
}
Copier après la connexion

Solution

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal