Its likely this is because the idx in a range is just that, its the index of the processing element and not a loop iteration variable.

As range never processes an element past the end of the slice, there's no way for it to get set to N, hence the difference in semantics from a normal for i := 0; i < N; i++ {} loop which relies on i being set to one past the end to break the loop.

Given this its expected that i in a range would only ever get to N-1.

    Regards
    Steve

On 26/07/2017 00:11, 'Axel Wagner' via golang-nuts wrote:
On Wed, Jul 26, 2017 at 12:52 AM, Chris Manghane <cm...@google.com <mailto:cm...@google.com>> wrote:

    This is mentioned directly in the language specification under For
    statements with range clause <https://golang.org/ref/spec#For_range>:

         For each entry it assigns iteration values to corresponding
        iteration variables if present and then executes the block.

    and

         For an array, pointer to array, or slice value a, the index
        iteration values are produced in increasing order, starting at
        element index 0. If at most one iteration variable is present,
        the range loop produces iteration values from 0 up to len(a)-1
        and does not index into the array or slice itself. For a nil
        slice, the number of iterations is 0.


    This seems logically correct to me, as well. For an array or slice
    of len(array) = N, the for range statement generates N iteration
    values, starting from 0. The Nth iteration value would have to be
    N-1. The difference in semantics is because the post statement in
    a for loop must be executed after the body is executed. A typical
    for-loop assigns the N+1st iteration value to the iteration
    variable, but that is a user's choice.

    Hopefully that is more clear,


Not really, sorry :) You basically reiterated the status quo, but did hardly explain /why/ those choices where actually made.

> For an array or slice of len(array) = N, the for range statement generates N iteration values, starting from 0. The Nth iteration value would have to be N-1.

That would also be the case if the loop would be equivalent to the obvious for-loop in regards to indices.

> he difference in semantics is because the post statement in a for loop must be executed after the body is executed.

Well, yeah, the question is, why wasn't this also done for range. Or rather, why wasn't the range of indices assigned decided to be equivalent with the most obvious for-loop. Especially as it seems, that if you use :=, the generated code actually *does* seem to include the extra increment (bringing the index to len(v), even if unobservably), so pure efficiency does not seem to be the reason.

The reason for the decision might very well be "someone just decided it that way and now that's the way it is". That'd be fine. I'd just be interested to know if there was a more deliberate reasoning behind this.


    Chris

    On Tue, Jul 25, 2017 at 3:30 PM, 'Axel Wagner' via golang-nuts
    <golang-nuts@googlegroups.com
    <mailto:golang-nuts@googlegroups.com>> wrote:

        Hey,

        someone shared [this
        
question](https://www.reddit.com/r/golang/comments/6paqc0/bug_that_caught_me_with_range/
        
<https://www.reddit.com/r/golang/comments/6paqc0/bug_that_caught_me_with_range/>)
        on reddit. I must say, that I'm surprised by the behavior
        myself. I would have expected
        for i = range v
        to be semantically equivalent to
        for i = 0; i < len(v); i++
        and don't really understand the reasoning behind choosing
        different semantics. Note, that the difference only exists, if
        i is declared outside of the loop, that is, this is solely
        about the behavior after exiting the loop-body.

        I'd greatly appreciate some explanation :)
-- You received this message because you are subscribed to the
        Google Groups "golang-nuts" group.
        To unsubscribe from this group and stop receiving emails from
        it, send an email to golang-nuts+unsubscr...@googlegroups.com
        <mailto:golang-nuts+unsubscr...@googlegroups.com>.
        For more options, visit https://groups.google.com/d/optout
        <https://groups.google.com/d/optout>.



--
You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com <mailto:golang-nuts+unsubscr...@googlegroups.com>.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to