mirror of
https://github.com/golang/go
synced 2024-11-22 03:34:40 -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:
parent
2e394c51d9
commit
b1d1da405a
@ -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
|
||||
|
@ -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},
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user