perf(decode): parse struct destinations without the value tree
Test / test (push) Successful in 1m50s
Test / test (push) Successful in 1m50s
Assisted-by: GLM 5.3 Flash
This commit is contained in:
+17
@@ -491,6 +491,23 @@ depth, including struct elements inside slices; map destinations accept every
|
||||
key by nature. When several keys are unknown, the message names the smallest
|
||||
one, so it does not depend on map iteration order.
|
||||
|
||||
### Direct decoding
|
||||
|
||||
For a struct destination whose type graph carries no untagged embedded map and
|
||||
no custom decode hook, `Unmarshal` and `(*Decoder).Decode` parse straight into
|
||||
the destination: the table skeleton is resolved against the struct schema while
|
||||
the document scans, and no intermediate value tree is kept. Values still flow
|
||||
through the ordinary assignment rules, so every conversion, hook and error the
|
||||
[Decoding](#decoding) section states holds verbatim; the parity with the tree
|
||||
path is pinned by a differential fuzz target that decodes every generated
|
||||
document both ways and compares the results.
|
||||
|
||||
A document or destination the direct skeleton cannot model — an unknown table
|
||||
under strictness it must sink, a hook that needs the whole parsed value, an
|
||||
embedded map filler — falls back to the tree path and reruns, so the
|
||||
observable behaviour is always the tree path's, exactly. Nothing changes for
|
||||
`Parse`, `ParseMap` or the document API: the tree remains theirs.
|
||||
|
||||
### Cancellation
|
||||
|
||||
`ParseContext`, `UnmarshalContext` and `(*Decoder).DecodeContext` accept a
|
||||
|
||||
Reference in New Issue
Block a user