diff options
| author | Rob Pike <r@golang.org> | 2015-04-03 13:10:47 -0700 |
|---|---|---|
| committer | Rob Pike <r@golang.org> | 2015-04-03 23:40:59 +0000 |
| commit | 4e5ac45ec5c15dba0f57f80e923a0de6f9f4f511 (patch) | |
| tree | 93c3b557f655573d1692d9542e17ab384e95805b /src/text/template/exec.go | |
| parent | 4f2a73011f2d076d97a2b46492ab21f26a33222b (diff) | |
| download | go-4e5ac45ec5c15dba0f57f80e923a0de6f9f4f511.tar.xz | |
text/template: provide a mechanism for options
Add one option, which is the motivating example, a way to control
what happens when a map is indexed with a key that is not in the map.
Rather than do something specific for that case, we provide a simple
general option mechanism to avoid adding API if something else
comes up. This general approach also makes it easy for html/template
to track (and adapt, should that become important).
New method: Option(option string...). The option strings are key=value
pairs or just simple strings (no =).
New option:
missingkey: Control the behavior during execution if a map is
indexed with a key that is not present in the map.
"missingkey=default" or "missingkey=invalid"
The default behavior: Do nothing and continue execution.
If printed, the result of the index operation is the string
"<no value>".
"missingkey=zero"
The operation returns the zero value for the map type's element.
"missingkey=error"
Execution stops immediately with an error.
Fixes #6288.
Change-Id: Id811e2b99dc05aff324d517faac113ef3c25293a
Reviewed-on: https://go-review.googlesource.com/8462
Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'src/text/template/exec.go')
| -rw-r--r-- | src/text/template/exec.go | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/text/template/exec.go b/src/text/template/exec.go index 613a778188..e6e1287993 100644 --- a/src/text/template/exec.go +++ b/src/text/template/exec.go @@ -519,7 +519,18 @@ func (s *state) evalField(dot reflect.Value, fieldName string, node parse.Node, if hasArgs { s.errorf("%s is not a method but has arguments", fieldName) } - return receiver.MapIndex(nameVal) + result := receiver.MapIndex(nameVal) + if !result.IsValid() { + switch s.tmpl.option.missingKey { + case mapInvalid: + // Just use the invalid value. + case mapZeroValue: + result = reflect.Zero(receiver.Type().Elem()) + case mapError: + s.errorf("map has no entry for key %q", fieldName) + } + } + return result } } s.errorf("can't evaluate field %s in type %s", fieldName, typ) |
