spec: document range over integer expression

This CL is partly based on CL 510535.

For #61405.

Change-Id: Ic94f6726f9eb34313f11bec7b651921d7e5c18d4
Reviewed-on: https://go-review.googlesource.com/c/go/+/538859
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Bypass: Robert Griesemer <gri@google.com>
Auto-Submit: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
This commit is contained in:
Robert Griesemer 2023-10-31 15:38:35 -07:00 committed by Robert Griesemer
parent 08b2f1f761
commit e5ef484691
1 changed files with 21 additions and 7 deletions

View File

@ -1,6 +1,6 @@
<!--{ <!--{
"Title": "The Go Programming Language Specification", "Title": "The Go Programming Language Specification",
"Subtitle": "Version of Oct 16, 2023", "Subtitle": "Version of Nov 1, 2023",
"Path": "/ref/spec" "Path": "/ref/spec"
}--> }-->
@ -6552,8 +6552,9 @@ for { S() } is the same as for true { S() }
<p> <p>
A "for" statement with a "range" clause A "for" statement with a "range" clause
iterates through all entries of an array, slice, string or map, iterates through all entries of an array, slice, string or map, values received on
or values received on a channel. For each entry it assigns <i>iteration values</i> a channel, or integer values from zero to an upper limit.
For each entry it assigns <i>iteration values</i>
to corresponding <i>iteration variables</i> if present and then executes the block. to corresponding <i>iteration variables</i> if present and then executes the block.
</p> </p>
@ -6564,12 +6565,12 @@ RangeClause = [ ExpressionList "=" | IdentifierList ":=" ] "range" Expression .
<p> <p>
The expression on the right in the "range" clause is called the <i>range expression</i>, The expression on the right in the "range" clause is called the <i>range expression</i>,
its <a href="#Core_types">core type</a> must be its <a href="#Core_types">core type</a> must be
an array, pointer to an array, slice, string, map, or channel permitting an array, pointer to an array, slice, string, map, channel permitting
<a href="#Receive_operator">receive operations</a>. <a href="#Receive_operator">receive operations</a>, or an integer.
As with an assignment, if present the operands on the left must be As with an assignment, if present the operands on the left must be
<a href="#Address_operators">addressable</a> or map index expressions; they <a href="#Address_operators">addressable</a> or map index expressions; they
denote the iteration variables. If the range expression is a channel, at most denote the iteration variables. If the range expression is a channel or integer,
one iteration variable is permitted, otherwise there may be up to two. at most one iteration variable is permitted, otherwise there may be up to two.
If the last iteration variable is the <a href="#Blank_identifier">blank identifier</a>, If the last iteration variable is the <a href="#Blank_identifier">blank identifier</a>,
the range clause is equivalent to the same clause without that identifier. the range clause is equivalent to the same clause without that identifier.
</p> </p>
@ -6594,6 +6595,7 @@ array or slice a [n]E, *[n]E, or []E index i int a[i] E
string s string type index i int see below rune string s string type index i int see below rune
map m map[K]V key k K m[k] V map m map[K]V key k K m[k] V
channel c chan E, &lt;-chan E element e E channel c chan E, &lt;-chan E element e E
integer n integer type I value i I
</pre> </pre>
<ol> <ol>
@ -6632,6 +6634,12 @@ For channels, the iteration values produced are the successive values sent on
the channel until the channel is <a href="#Close">closed</a>. If the channel the channel until the channel is <a href="#Close">closed</a>. If the channel
is <code>nil</code>, the range expression blocks forever. is <code>nil</code>, the range expression blocks forever.
</li> </li>
<li>
For an integer value <code>n</code>, the iteration values 0 through <code>n-1</code>
are produced in increasing order, with the same type as <code>n</code>.
If <code>n</code> &lt= 0, the loop does not run any iterations.
</li>
</ol> </ol>
<p> <p>
@ -6684,6 +6692,12 @@ for w := range ch {
// empty a channel // empty a channel
for range ch {} for range ch {}
// call f(0), f(1), ... f(9)
for i := range 10 {
// type of i is int (default type for untyped constant 10)
f(i)
}
</pre> </pre>