aboutsummaryrefslogtreecommitdiff
path: root/src/reflect/value.go
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josharian@gmail.com>2021-05-21 09:43:58 -0700
committerJosh Bleecher Snyder <josharian@gmail.com>2021-09-07 23:09:06 +0000
commit07f623063ddf8216b03a4a17a27110d330e80c7e (patch)
treec6d35df3fa5ed8dffffba4ac862472fd344de515 /src/reflect/value.go
parenta9a01a3fbdf70e7a9d914fe0b9b5ab1199fd74fe (diff)
downloadgo-07f623063ddf8216b03a4a17a27110d330e80c7e.tar.gz
go-07f623063ddf8216b03a4a17a27110d330e80c7e.zip
reflect: add MapIter.Reset
This allows callers to do (amortized) allocation-free iteration over many maps. Fixes #46293 Change-Id: I3aa6134dd00da35b508bd1e3b487332a871a3673 Reviewed-on: https://go-review.googlesource.com/c/go/+/321891 Trust: Josh Bleecher Snyder <josharian@gmail.com> Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/reflect/value.go')
-rw-r--r--src/reflect/value.go12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/reflect/value.go b/src/reflect/value.go
index 90f31bae0a..39c3c0f06e 100644
--- a/src/reflect/value.go
+++ b/src/reflect/value.go
@@ -1700,6 +1700,18 @@ func (it *MapIter) Next() bool {
return mapiterkey(&it.hiter) != nil
}
+// Reset modifies it to iterate over v.
+// It panics if v's Kind is not Map and v is not the zero Value.
+// Reset(Value{}) causes it to not to refer to any map,
+// which may allow the previously iterated-over map to be garbage collected.
+func (it *MapIter) Reset(v Value) {
+ if v.IsValid() {
+ v.mustBe(Map)
+ }
+ it.m = v
+ it.hiter = hiter{}
+}
+
// MapRange returns a range iterator for a map.
// It panics if v's Kind is not Map.
//