JSON 末尾のコンマ: Go の実行時の難問
複合リテラルの末尾のカンマに関する Dave Cheney の原則は、JSON 解析にも適用されます。ただし、末尾にカンマがある JSON データを処理する場合、賢明な Go プログラマーは実行時エラーに遭遇します。この記事では、この動作の背後にある根本的な理由を検討します。
セミコロン ルールに従って末尾のカンマが必要な Go の複合リテラルとは異なり、JSON 構文では末尾のカンマが厳密に禁止されています。次のコードはこの問題を示しています。
<code class="go">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 が整形式であることを期待しており、上記の例の末尾のカンマが無効になるためです。
JSON 仕様によれば、JSON では末尾のカンマは許可されません。配列またはマップ。したがって、たとえ Go の構文でそれらが許可されていても、JSON パーサーはそれらをエラーとして解釈します。この動作は、相互運用性を維持し、異なる JSON パーサー間の不一致を防ぐために不可欠です。
結論として、Go で末尾のカンマを含む JSON を解析する場合は、JSON 仕様を遵守し、それらを削除することが不可欠です。パーサーに末尾のカンマを強制的に受け入れるように試みることはお勧めできません。予期しないエラーや互換性の問題が発生する可能性があります。
以上がJSON の末尾のカンマが Go でランタイム エラーを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。