docs から:
JSONは循環データ構造を表すことができず、Marshalはそれらを処理しません。巡回構造をMarshalに渡すと、無限再帰が発生します。
私はこの状況を経験しており、その結果ランタイムパニックが発生します。
私が思っているのは、json.Marshalが非nilエラーを返すパニックでない状況を実証する作業プログラムを誰でも提供できるかどうかです。最良の答えは、使用された入力を明確に含むです。
ジョナサンの答えを補足するために、json.Marshal関数はUnsupportedTypeError
またはUnsupportedValueError
の2種類のエラーを返すことができます
ジョナサンが無効な型をマーシャルしようとすることで言ったように、最初のものが引き起こされる可能性があります:
_, err := json.Marshal(make(chan int))
_, ok := err.(*json.UnsupportedTypeError) // ok == true
一方、無効な値を渡すことにより、マーシャル関数がエラーを返すようにすることもできます。
_, err := json.Marshal(math.Inf(1))
_, ok := err.(*json.UnsupportedValueError) // ok == true
更新:エラーを誘発するためにmap [int] intの代わりにチャンネルを使用するようになりました
移動固有の構造(例: func
またはchan
シリアル化の拒否:
package main
import (
"encoding/json"
"fmt"
)
func main() {
value := make(chan int)
_, err := json.Marshal(value)
fmt.Println(err)
}