De la docs :
JSON ne peut pas représenter les structures de données cycliques et Marshal ne les gère pas. Passer des structures cycliques à Marshal entraînera une récursion infinie.
J'ai rencontré cette situation, ce qui entraîne une panique d'exécution.
Ce que je me demande, c'est si quelqu'un peut fournir un programme de travail qui démontre une situation sans panique où json.Marshal renvoie une erreur non nulle. Les meilleures réponses devraient inclure clairement les entrées utilisées .
Pour compléter la réponse de Jonathan, la fonction json.Marshal peut renvoyer deux types d'erreurs: UnsupportedTypeError
ou UnsupportedValueError
Le premier peut être causé, comme l'a dit Jonathan en essayant de marshaler un type invalide:
_, err := json.Marshal(make(chan int))
_, ok := err.(*json.UnsupportedTypeError) // ok == true
D'un autre côté, vous pouvez également demander à la fonction Marshal de renvoyer une erreur en transmettant une valeur non valide:
_, err := json.Marshal(math.Inf(1))
_, ok := err.(*json.UnsupportedValueError) // ok == true
Mise à jour: utilise maintenant un canal au lieu d'une carte [int] int pour provoquer l'erreur
Structures spécifiques à Go, par exemple. func
ou chan
refusent de sérialiser:
package main
import (
"encoding/json"
"fmt"
)
func main() {
value := make(chan int)
_, err := json.Marshal(value)
fmt.Println(err)
}