OK, after initializing k to an actual value, I see what's happening:

k = ""  prior to the loop
m = {"foo": 314, "bar": 42} prior to the loop

loop, round 1
k gets set to "foo"
m[""] gets set to 314 -- AND by chance, the map iterator is going to visit
this new map entry later (round 3).
m["foo"] gets deleted

loop, round 2
k gets set to "bar"
m["foo"] gets set to 42
m["bar"] gets deleted

loop, round 3
k gets set to ""
m["bar"] gets set to 314 -- the value of m[""]
m[""] gets deleted

At the end of the loop, m is left with foo and bar as keys, and the values
have been swapped.


On Sat, Jul 9, 2016 at 3:47 PM Matt Harden <matt.har...@gmail.com> wrote:

> OK but based on Jesse's explanation, I expect the map to contain keys
> "bar" and "". But in fact, in the playground at least, we get "foo" and
> "bar", with the values reversed:
>
> foo
> bar
>
> map[foo:314 bar:42]
>
>
> I can't think of a valid explanation for that behavior.
>
>
> On Thu, Jul 7, 2016 at 4:44 PM <keith.rand...@gmail.com> wrote:
>
>> I don't think there are any.  Because you can do it doesn't mean you
>> should.  It's incredibly confusing for readers (hence the confusion in this
>> thread).
>>
>> On Thursday, July 7, 2016 at 8:52:06 AM UTC-7, Kyle Stanly wrote:
>>>
>>> So, what would be the appropriate use-cases for this; I.E, using a map
>>> index expression as the value?
>>>
>>> On Thursday, July 7, 2016 at 10:05:42 AM UTC-4, Kyle Stanly wrote:
>>>>
>>>> I noticed that the specification states:
>>>>
>>>> "As with an assignment, if present the operands on the left must be
>>>> addressable or map index expressions; they denote the iteration
>>>> variables."
>>>>
>>>>
>>>> Here is the thing I am having trouble imagining... if the iterator
>>>> keeps a snapshot of the map at the time the iterator was created, would the
>>>> map index expression obtain the actual, up-to-date value for the given key?
>>>> Maybe even determine if it was deleted?
>>>>
>>>> I.E...
>>>>
>>>> for k, m[k] := range m {...}
>>>>
>>>> Apparently is valid Go syntax, however what are the semantics behind
>>>> this? If another Goroutine calls delete(...) and removes that element from
>>>> the map, would this pretty much restore that value back into the map (from
>>>> what is held in the snapshot)? How would you go about retrieving that value
>>>> again? Do you need to re-enter the map to obtain the value again through
>>>> that key, 'k'? What are the practical applications for this?
>>>>
>>>> --
>> 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.
>>
>

-- 
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