Skip to content

v1.8.1

Latest

Choose a tag to compare

@osteele osteele released this 27 Feb 04:11

Performance

  • Template Rendering: ~25% faster, ~54% less memory, ~27% fewer allocations in template rendering benchmarks.
    • Cache compiled scanner regex instead of recompiling per Scan() call
    • Reuse forloop variable map across loop iterations instead of allocating a new map per iteration
    • Add fast paths for string, int, float64, and bool in writeObject, avoiding fmt.Sprint and reflection
    • Reuse expression evaluation context across {{ }} expressions instead of allocating per expression
    • Use stack-allocated array for filter arguments, avoiding heap allocation for filters with ≤4 args
    • Use maps.Copy with pre-sized maps for bindings copies

Fixed

  • String-to-Number Conversion in Arithmetic Filters: Fixed regression where string values from bindings were not converted to numbers in plus, minus, times, and divided_by filters. For example, {{ str_var | plus: 1 }} where str_var = "10" now correctly returns 11 instead of 1. This was introduced in v1.8.0 when filter signatures changed from float64 to any (#124).

Changed

  • Replace custom intMin/intMax helpers with Go 1.21+ min/max builtins.

Tests

  • Expanded test coverage across render, parser, values, filters, and engine packages.