Expr is an engine that can evaluate expressions.
The purpose of the package is to allow users to use expressions inside configuration for more complex logic. It is a perfect candidate for the foundation of a business rule engine. The idea is to let configure things in a dynamic way without recompile of a program:
# Get the special price if
user.Group in ["good_customers", "collaborator"]
# Promote article to the homepage when
len(article.Comments) > 100 and article.Category not in ["misc"]
# Send an alert when
product.Stock < 15
Inspired by
- Symfony's The ExpressionLanguage component,
- Rob Pike's talk Lexical Scanning in Go.
- Works with any valid Go object (structs, maps, etc)
- Static and dynamic typing (example)
code := "groups[0].Title + user.Age" p, err := expr.Parse(code, expr.Define("groups", []Group{}), expr.Define("user", User{})) // err: invalid operation: groups[0].Name + user.Age (mismatched types string and int)
- User-friendly error messages
unclosed "(" (boo + bar] ----------^
- Reasonable set of basic operators
- Fast (faster otto and goja, see bench)
go get -u github.com/antonmedv/expr
- See
for developer documentation,
- See The Expression Syntax page to learn the syntax of the Expr expressions.
MIT