diff options
| author | qiulaidongfeng <2645477756@qq.com> | 2024-09-19 13:45:13 +0000 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2024-09-23 14:35:44 +0000 |
| commit | cfbd2e7b40fac7809a404c49c46106e259078a61 (patch) | |
| tree | a8d850b00b9e2b9c71df540f0f91cbff026864ce /src/text/template/exec.go | |
| parent | 0081f17f146140f5c02344bed16c530472fcdb0f (diff) | |
| download | go-cfbd2e7b40fac7809a404c49c46106e259078a61.tar.xz | |
text/template: support range-over-func
For #66107
Change-Id: I2fcd04bebe80346dbd244ab7ea09cbe6010b9d8e
GitHub-Last-Rev: 5ebf615db5889a04738c555c651e07c1fd287748
GitHub-Pull-Request: golang/go#68329
Reviewed-on: https://go-review.googlesource.com/c/go/+/596956
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Diffstat (limited to 'src/text/template/exec.go')
| -rw-r--r-- | src/text/template/exec.go | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/text/template/exec.go b/src/text/template/exec.go index 5b35b3e5a8..96d2f50ef8 100644 --- a/src/text/template/exec.go +++ b/src/text/template/exec.go @@ -434,6 +434,43 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) { return case reflect.Invalid: break // An invalid value is likely a nil map, etc. and acts like an empty map. + case reflect.Func: + if val.Type().CanSeq() { + if len(r.Pipe.Decl) > 1 { + s.errorf("can't use %s iterate over more than one variable", val) + break + } + run := false + for v := range val.Seq() { + run = true + // Pass element as second value, + // as we do for channels. + oneIteration(reflect.Value{}, v) + } + if !run { + break + } + return + } + if val.Type().CanSeq2() { + run := false + for i, v := range val.Seq2() { + run = true + if len(r.Pipe.Decl) > 1 { + oneIteration(i, v) + } else { + // If there is only one range variable, + // oneIteration will use the + // second value. + oneIteration(reflect.Value{}, i) + } + } + if !run { + break + } + return + } + fallthrough default: s.errorf("range can't iterate over %v", val) } |
