Go の有名な専門家である Dave Cheney は、複合リテラルの各行を次で終了する重要性を強調しています。カンマ。ただし、このルールは Go の JSON 解析と矛盾しているようです。
次のコードを考えてみましょう:
<code class="go">package main import ( "fmt" "encoding/json" ) type jsonobject struct { Objects []ObjectType `json:"objects"` } type ObjectType struct { Name string `json:"name"` } func main() { bytes := []byte(`{ "objects": [ {"name": "foo"}, // REMOVE THE COMMA TO MAKE THE CODE WORK! ]}`) jsontype := &jsonobject{} json.Unmarshal(bytes, &jsontype) fmt.Printf("Results: %v\n", jsontype.Objects[0].Name) // panic: runtime error: index out of range }</code>
このコードでは、JSON 配列から末尾のカンマを削除することで機能します。しかし、この矛盾を回避する方法はありませんか?
残念ながら、ありません。 JSON 仕様では、末尾にカンマを使用することは禁止されています。別の行に続く開いた列挙に末尾のカンマを追加するのは、有効な Go 構文です。ただし、これは JSON には当てはまりません。
無効な JSON 構造の例を次に示します:
{ "objects": [ {"name": "foo"}, ]}
たとえ特定の JSON パーサーにこの形式を受け入れるように説得できたとしても、他の有効な JSON パーサーは正しくエラーを報告します。したがって、JSON 仕様に従い、末尾のカンマを避けることをお勧めします。
以上が末尾にカンマがある JSON 配列を解析すると、Go コードがランタイム エラーでパニックになるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。