From 44cdb37b038e7c79893dfe431e9d88d1b07148c4 Mon Sep 17 00:00:00 2001 From: Tatsushi Demachi Date: Mon, 9 Mar 2015 22:55:04 +0900 Subject: [PATCH] Fix eq and ne tpl function issue `eq` and `ne` template functions don't work as expected when those are used with a raw number and a calculated value by add, sub etc. It's caused by both numbers type differences. For example, `eq 5 (add 2 3)` returns `false` because raw 5 is `int` while `add 2 3` returns 5 with `int64` This normalizes `int`, `uint` and `float` type values to `int64`, `uint64` and `float64` before comparing them. Other type of value is passed to comparing function without any changes. Fix #961 --- tpl/template.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tpl/template.go b/tpl/template.go index 231946b34..148ec03c3 100644 --- a/tpl/template.go +++ b/tpl/template.go @@ -94,6 +94,21 @@ func New() Template { } func Eq(x, y interface{}) bool { + normalize := func(v interface{}) interface{} { + vv := reflect.ValueOf(v) + switch vv.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return vv.Int() + case reflect.Float32, reflect.Float64: + return vv.Float() + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return vv.Uint() + default: + return v + } + } + x = normalize(x) + y = normalize(y) return reflect.DeepEqual(x, y) }