github.com/expr-lang/expr
v1.17.8
#499 most downloaded on Go modules
expr-lang/expr
What this package is like to depend on
Last release 1 months ago
07 Jul 2026
Ships fairly regularly
a new release about every 1 weeks
Some releases are documented
notes for 10 of 40 stable releases
Nothing withdrawn
no release was ever pulled
8 years old
272 releases · first in 2018
75 releases in the last 12 months
see the full history below
Release timeline
272 releases · Jul 2018 to Jul 2026Releases
latest 60 of 272-
v1.17.9-0.20260707065720-4b31df3a2e0e07 Jul 2026 pre-releaseNothing published for this version
-
v1.17.9-0.20260604165153-2010a1126f1304 Jun 2026 pre-releaseNothing published for this version
-
v1.17.9-0.20260526121354-630bbf0d7b1226 May 2026 pre-releaseNothing published for this version
-
v1.17.9-0.20260412144015-3a46b1970b3712 Apr 2026 pre-releaseNothing published for this version
-
v1.17.9-0.20260313095659-b90e77c64fb913 Mar 2026 pre-releaseNothing published for this version
-
v1.17.9-0.20260228100243-851b241a301f28 Feb 2026 pre-releaseNothing published for this version
-
v1.17.9-0.20260223100544-27acc2dd45bb23 Feb 2026 pre-releaseNothing published for this version
-
v1.17.9-0.20260218125051-3abfc80cdbc518 Feb 2026 pre-releaseNothing published for this version
-
v1.17.814 Feb 2026Release notes
Open source →Expr is an expression language designed to deliver dynamic configurations with unparalleled accuracy,
safety, and speed.program, err := expr.Compile(`let foo = bar(); baz(foo, foo)`)
In this release:
- New feature: added bytes literal syntax (#894)
- Improved performance: count comparisons to any (#897)
- Improved performance: added sum range optimization (#896)
- Improved performance: added count threshold comparisons (#898)
- Improved performance: optimize loop iteration with scope pool (#908)
- Improved performance: added fast paths for min, max, mean, and median (#909)
- Fixed: ctx into nested custom funcs and Env (#883)
- Fixed: disable check for missing predicate during parseing (#924)
- Fixed: detect $env() calls at compile time (#923)
- Fixed: bounds check to get() (#918)
- Fixed: validate sortBy order argument type (#912)
- Fixed: reduce empty array without init val (#911)
- Fixed: validate arg count before OpCall (#904)
- Fixed: correct variadic method arg type (#889)
-
v1.17.8-0.20260212145126-f0176e7ad3ad12 Feb 2026 pre-releaseNothing published for this version
-
v1.17.8-0.20260205062502-2aaa9aa0612a05 Feb 2026 pre-releaseNothing published for this version
-
v1.17.8-0.20260201211147-0785f19850dd01 Feb 2026 pre-releaseNothing published for this version
-
v1.17.8-0.20260128130121-d3805b027f1628 Jan 2026 pre-releaseNothing published for this version
-
v1.17.8-0.20260127060229-9c830634f98b27 Jan 2026 pre-releaseNothing published for this version
-
v1.17.8-0.20260124102547-553025ac7d0b24 Jan 2026 pre-releaseNothing published for this version
-
v1.17.8-0.20260123215441-77df21185c1223 Jan 2026 pre-releaseNothing published for this version
-
v1.17.8-0.20260123122543-a9ac10fa699b23 Jan 2026 pre-releaseNothing published for this version
-
v1.17.8-0.20260122234442-556b1d14d40e22 Jan 2026 pre-releaseNothing published for this version
-
v1.17.8-0.20260119101304-1fa02826f36119 Jan 2026 pre-releaseNothing published for this version
-
v1.17.8-0.20260115095527-5ef01205d97715 Jan 2026 pre-releaseNothing published for this version
-
v1.17.8-0.20260112204935-4ff281dde73512 Jan 2026 pre-releaseNothing published for this version
-
v1.17.8-0.20260111212016-ebbe1bac9de711 Jan 2026 pre-releaseNothing published for this version
-
v1.17.8-0.20260108144341-02f92c2a78e408 Jan 2026 pre-releaseNothing published for this version
-
v1.17.8-0.20260105223955-0fcde75fea5305 Jan 2026 pre-releaseNothing published for this version
-
v1.17.8-0.20251227142217-3111bbe8c72d27 Dec 2025 pre-releaseNothing published for this version
-
v1.17.8-0.20251225163038-c020e959592725 Dec 2025 pre-releaseNothing published for this version
-
v1.17.714 Dec 2025Release notes
Open source →Expr is a Go-centric expression language designed to deliver dynamic configurations with unparalleled accuracy,
safety, and speed.program, err := expr.Compile(`let foo = bar(); baz(foo, foo)`)
This release brings new language features, performance improvements across runtime and compiler, better error
handling, and many important bug fixes.New Features
Support for
else ifexpressions- You can now chain conditional branches using
else if! (#879)
Unicode escapes in the
\u{XXXXXX}format- String literals now support Unicode code point escapes such as
\u{1F600}. (#882)
Byte slice support in the
matchesoperatorThe
matchesoperator now works with[]byte, improving interoperability with binary data. (#876)Short-circuit control options
New options allow enabling or disabling short-circuiting behavior in the compiler and VM. (#847)
Option to disable
ifoperatorA separate
DisableIfOperatoroption is now available. (#881)Performance Improvements
Runtime structure fetch improvements
Accessing struct fields at runtime is now faster. (#833)
VM function call optimizations
Function calls inside the VM execute more efficiently. (#832)
Type system performance boost
Large or complex type operations now run significantly faster. (#824)
Bug Fixes
- Guard negative forward jump offsets (#861).
- Prevent stack underflow in the VM (#860).
- Correct behavior of
AsBoolwith nil and undefined variables (#866). - Proper handling of nil arguments in variadic functions (#868).
- Show function name for safe calls in disassembly (#869).
- Limit recursion depth in built-in functions (#870).
- Throw an error when a predicate is missing in the parser (#842).
- Fixed array type resolution in conditional operator (#865).
- Disallow access to unexported struct fields (#846).
- Fixed retrieving field pointers in structs (#843).
- Better error position reporting in multi-line scripts (#827).
- Support quoting backticks inside string literals (#820).
- Fixed auto-dereference for maps/slices and conditionals (#871).
- Wrap merged optimizer results as predicates (#864).
- Improved missing property handling (#854).
- Handle invalid
ifconditions and detect null-byte crashes. - Added regression tests for several reported issues.
- You can now chain conditional branches using
-
v1.17.7-0.20251214230820-d4722867d2df14 Dec 2025 pre-releaseNothing published for this version
-
v1.17.7-0.20251214200220-087698e2554c14 Dec 2025 pre-releaseNothing published for this version
-
v1.17.7-0.20251214113201-cf53913bd4fb14 Dec 2025 pre-releaseNothing published for this version
-
v1.17.7-0.20251210132847-775fc3aca52010 Dec 2025 pre-releaseNothing published for this version
-
v1.17.7-0.20251204160008-593f93febed204 Dec 2025 pre-releaseNothing published for this version
-
v1.17.7-0.20251204143947-3dbda4bd9c2504 Dec 2025 pre-releaseNothing published for this version
-
v1.17.7-0.20251128124506-ad495449fa5628 Nov 2025 pre-releaseNothing published for this version
-
v1.17.7-0.20250929091045-5ac4a1a7991929 Sep 2025 pre-releaseNothing published for this version
-
v1.17.7-0.20250921185824-3d0aec62ca6c21 Sep 2025 pre-releaseNothing published for this version
-
v1.17.7-0.20250918194544-69b27afae29818 Sep 2025 pre-releaseNothing published for this version
-
v1.17.7-0.20250908084052-1c09e5e9ec3d08 Sep 2025 pre-releaseNothing published for this version
-
v1.17.7-0.20250828090651-bbcbc530f31628 Aug 2025 pre-releaseNothing published for this version
-
v1.17.624 Jul 2025 -
v1.17.6-0.20250724062913-87df7831948924 Jul 2025 pre-releaseNothing published for this version
-
v1.17.6-0.20250705114648-11286428d37505 Jul 2025 pre-releaseNothing published for this version
-
v1.17.6-0.20250630182125-f1c65fa312db30 Jun 2025 pre-releaseNothing published for this version
-
v1.17.503 Jun 2025 -
v1.17.5-0.20250527103933-5fbfe7211cd627 May 2025 pre-releaseNothing published for this version
-
v1.17.427 May 2025 -
v1.17.4-0.20250526080353-f974b88d463e26 May 2025 pre-releaseNothing published for this version
-
v1.17.312 May 2025 -
v1.17.3-0.20250512163248-28d9b3d4575b12 May 2025 pre-releaseNothing published for this version
-
v1.17.3-0.20250328145033-785630f7830028 Mar 2025 pre-releaseNothing published for this version
-
v1.17.224 Mar 2025 -
v1.17.2-0.20250321170909-646c17c9621121 Mar 2025 pre-releaseNothing published for this version
-
v1.17.2-0.20250319142959-ac5b2c7313f419 Mar 2025 pre-releaseNothing published for this version
-
v1.17.2-0.20250318225751-253a4a11187318 Mar 2025 pre-releaseNothing published for this version
-
v1.17.118 Mar 2025Release notes
Open source →- Fixed parsing of variable declaration nodes combined with sequence node in #773
-
v1.17.1-0.20250317132804-0f99b191762117 Mar 2025 pre-releaseNothing published for this version
-
v1.17.1-0.20250317091042-8419ba4a916c17 Mar 2025 pre-releaseNothing published for this version
-
v1.17.1-0.20250316093506-1598c621e18116 Mar 2025 pre-releaseNothing published for this version
-
v1.17.015 Mar 2025Release notes
Open source →Expr is a Go-centric expression language designed to deliver dynamic configurations with unparalleled accuracy,
safety, and speed.program, err := expr.Compile(`let foo = bar(); baz(foo, foo)`)
In this release:
This release added the biggest change to the Expr language: if-else expressions and sequential expressions. #736 e750878
if foo > 42 { assert(foo); calc(foo, foo / 2) } else { calc(0, 0) }
A sequence of expression may be separated by
;char. The last semicolon must be omitted. Expr returns the value of the
last expression in the sequence.If-else is also expressions. Each
ifmust have anelsepart. Result of if-else can be used as an expression:let foo = if bar > 0 { process(bar) } else { fallback() }; foo + 42
Added:
- Added
ast.Findhelper for easy AST searching. 579de74 - Added compile node budget and memory limits (#762)
- Added
uniq()builtin (#705) - Added
flatten()builtin (#684) - Added types pkg (#665 #667 #668)
Improvements:
- Allow tailing comma in arguments (#623)
- Improved type checker for named types 6fa83ad
- Now
len()return runes count for string e8bd7f8 - Improved VM code coverage (now 98%!) (#750)
- Improved support for auto-dereferences and pointer usage 2bc0eed f4bbea5 80f0ea6 4511e92 29dff34
Fixes:
- Make sure
get()returns nil formap[string]stringon missing keys 435b79d - Fixed func calls with nil types value d63c3b5
- Fixed AST printing of ops with precedence (#678)
- Do not optimize
filter() | map()if#indexis used 35bdb68 - Separated patching phases for patchers that require multiple passes. (#659)
- Added
-
v1.16.10-0.20260707065720-4b31df3a2e0e07 Jul 2026 pre-releaseNothing published for this version