feat: honour the omitzero and omitempty tag options on encode
Assisted-by: GLM 5.3 Flash
This commit is contained in:
+24
@@ -233,6 +233,30 @@ Keys that match `[A-Za-z0-9_-]+` are emitted bare, all others quoted. A
|
||||
`map[string]V` emits its keys in sorted order for deterministic output, and a
|
||||
nil map emits nothing.
|
||||
|
||||
### Tag options
|
||||
|
||||
The part of a `toml` tag after the first comma carries options. Both options
|
||||
shape emission only; the decoder ignores them.
|
||||
|
||||
- `omitzero` skips the field when its value is the zero value of its type. A
|
||||
type with an `IsZero() bool` method (time.Time among them) decides through
|
||||
that method, so a zero `time.Time` or an all-zero struct disappears from
|
||||
the output.
|
||||
- `omitempty` skips the field when it holds an empty collection: a nil or
|
||||
empty slice or array, or a nil or empty map. Strings and other scalars are
|
||||
not covered by `omitempty`; use `omitzero` for those.
|
||||
|
||||
```go
|
||||
type Config struct {
|
||||
Host string `toml:"host,omitzero"`
|
||||
Started time.Time `toml:"started,omitzero"`
|
||||
Tags []string `toml:"tags,omitempty"`
|
||||
}
|
||||
```
|
||||
|
||||
Options combine after the name: `toml:"name,omitempty,omitzero"` is valid, and
|
||||
an unknown option is ignored.
|
||||
|
||||
Note the asymmetry: the encoder inlines untagged embedded structs, while the
|
||||
decoder expects them under their lower-cased type name. A struct with an
|
||||
untagged embedded struct therefore does not round-trip through `Unmarshal` into
|
||||
|
||||
Reference in New Issue
Block a user