NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Go modules
Last release 27 days ago
03 Sep 2026
Ships unpredictably
gaps range from 8 days to 5.8 years
Most releases are documented
notes for 7 of 8 stable releases
Nothing withdrawn
no release was ever pulled
7 years old
16 releases · first in 2020
One column per quarter.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Struct field offset cache eliminates repeated reflect.StructField allocations.
Struct field offset cache eliminates repeated reflect.StructField allocations.
| Benchmark | v4.4.0 | v4.4.1 | Improvement |
|---|---|---|---|
| ValidateStruct (6 fields) | 59 allocs, 4.7 KB, 6.7µs | 38 allocs, 2.3 KB, 3.6µs | -36% allocs, -50% memory, -46% time |
| ValidateWithConditional | 34 allocs, 3.8µs | 19 allocs, 1.7µs | -44% allocs, -56% time |
Also fixes benchmark to pre-compile regex (was inflating alloc count).
Full Changelog: v4.4.0...v4.4.1
Revival release — ozzo-validation is actively maintained again after 6 years.
Revival release — ozzo-validation is actively maintained again after 6 years.
12 community PRs merged, maintainer bug fixes, modernized CI infrastructure.
is.UUIDv7 validation rule per RFC 9562 (#205 by @dmitryzhvinklis)is.ULID validation rule (#171 by @upamune)is.Origin validation rule for CORS origins (#198 by @nguyenvantuan2391996)OptionalKey() and DynamicMap() convenience constructors (#151 by @Jessinra)EachUntilFirstError() rule for large collections (#93 by @geekflyer)+ prefix per ITU-T standard (#208 by @Yanhu007)Each() now passes pointers correctly to By() callbacks (#160 by @dane)IsEmpty() treats all zero-valued structs as empty (#144 by @soranoba)Errors.Error() no longer panics on nil values (#212)Min()/Max() now validate zero values instead of silently skipping them (#212)These are bug fixes — the old behavior was incorrect:
is.E164 rejects phone numbers without + prefix (spec-correct)Each() with By() on pointer slices passes *T instead of TIsEmpty() returns true for zero-valued structs (was only time.Time{})Min()/Max() validate numeric zero and time.Time{} (were silently skipped)Thanks to all contributors who waited patiently — some PRs were open for 5+ years.
Special thanks to @qiangxue for entrusting the project to new maintainers.
Project revived after 6 years of inactivity. New maintainer: @kolkov.
is.UUIDv7 validation rule per RFC 9562 (#205 by @dmitryzhvinklis)is.ULID validation rule (#171 by @upamune)is.Origin validation rule for CORS origins (#198 by @nguyenvantuan2391996)OptionalKey() and DynamicMap() convenience constructors (#151 by @Jessinra)EachUntilFirstError() rule for large collections (#93 by @geekflyer)+ prefix per ITU-T standard (#208 by @Yanhu007) — fixes #195Each() now passes pointers correctly to By() callbacks (#160 by @dane)IsEmpty() treats all zero-valued structs as empty, not just time.Time{} (#144 by @soranoba) — fixes #143Errors.Error() no longer panics on nil values (#212) — fixes #147Min()/Max() now validate zero values instead of silently skipping them (#212) — fixes #165, #180is.E164 now rejects phone numbers without + prefix (spec-correct behavior)Each() with By() on pointer slices now passes *T instead of T (correct behavior)IsEmpty() returns true for zero-valued structs (was only time.Time{} before)Min()/Max() now validate numeric zero and time.Time{} instead of skipping themNothing published for this version
Thanks to @NathanBaulch for the great contribution!
When and Each rulesThanks to @NathanBaulch for the great contribution!
#114 Fallback to field name for ignored JSON fields (thanks to @seriousben !) #123 Added Skip.When() to support conditional skipping validation rules
Skip.When() to support conditional skipping validation rules (thanks to @maratori!)Nothing published for this version
Nothing published for this version
Upgraded govalidator to v10 and added the EmailFormat validation rule to validate an email address without checking the existence of MX record
EmailFormat validation rule to validate an email address without checking the existence of MX recordis.Domain rule. (thanks to @TheSecEng)Nil and Empty rules (thanks to @samber)Else clause to the When conditional validation construct (thanks to @samber)Length rule when requiring zero length (thanks to @0perl)RequiredRule struct is made public (thanks to @erdaltsksn)Nothing published for this version
#95 , #96 : Added validation.When() and validation.Required.When() to support conditional validation. Thanks to @mehran-prs for the great contribution
validation.When() and validation.Required.When() to support conditional validation. Thanks to @mehran-prs for the great contribution to this new feature!Improved the performance of Errors.Error() . Thanks to @geekflyer for the profiling work and code contribution!
validation.Error as the validation error type. It supports error code and parameter placeholders in error messages, which allows checking validation errors programmatically and translating error messages based on error codes. Thanks to @mehran-prs for the great contribution to this new feature!Errors.Error(). Thanks to @geekflyer for the profiling work and code contribution!Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →