1
0
mirror of https://github.com/golang/go synced 2024-11-22 03:14:41 -07:00

exp/template: add builtin len function

R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/4868045
This commit is contained in:
Rob Pike 2011-08-12 11:47:44 +10:00
parent 2e394c51d9
commit b1d1da405a
3 changed files with 24 additions and 0 deletions

View File

@ -232,6 +232,8 @@ Predefined global functions are named as follows.
js
Returns the escaped JavaScript equivalent of the textual
representation of its arguments.
len
Returns the integer length of its argument.
not
Returns the boolean negation of its single argument.
or

View File

@ -331,6 +331,12 @@ var execTests = []execTest{
{"map[WRONG]", "{{index .MSI 10}}", "", tVal, false},
{"double index", "{{index .SMSI 1 `eleven`}}", "11", tVal, true},
// Len.
{"slice", "{{len .SI}}", "3", tVal, true},
{"map", "{{len .MSI }}", "3", tVal, true},
{"len of int", "{{len 3}}", "", tVal, false},
{"len of nothing", "{{len .Empty0}}", "", tVal, false},
// With.
{"with true", "{{with true}}{{.}}{{end}}", "true", tVal, true},
{"with false", "{{with false}}{{.}}{{else}}FALSE{{end}}", "FALSE", tVal, true},

View File

@ -27,6 +27,7 @@ var builtins = FuncMap{
"html": HTMLEscaper,
"index": index,
"js": JSEscaper,
"len": length,
"not": not,
"or": or,
"print": fmt.Sprint,
@ -140,6 +141,21 @@ func index(item interface{}, indices ...interface{}) (interface{}, os.Error) {
return v.Interface(), nil
}
// Length
// length returns the length of the item, with an error if it has no defined length.
func length(item interface{}) (int, os.Error) {
v, isNil := indirect(reflect.ValueOf(item))
if isNil {
return 0, fmt.Errorf("len of nil pointer")
}
switch v.Kind() {
case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String:
return v.Len(), nil
}
return 0, fmt.Errorf("len of type %s", v.Type())
}
// Boolean logic.
func truth(a interface{}) bool {