ref: 44cdb37b038e7c79893dfe431e9d88d1b07148c4
parent: 91d16fbba09d3552af7b5327797dd2b5d9861b35
author: Tatsushi Demachi <[email protected]>
date: Mon Mar 9 18:55:04 EDT 2015
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
--- a/tpl/template.go
+++ b/tpl/template.go
@@ -94,6 +94,21 @@
}
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)
}