Как добавить в карту в цикле дальности - PullRequest
1 голос
/ 28 марта 2019
package main

import (
    "fmt"
)

func main() {
    m := make(map[int]int, 4)
    m[1] = 0
    m[2] = 0
    for k, _ := range m {
        i := 10 + k
        m[i] = 0
    }
    fmt.Println(m)
    fmt.Println("len:", len(m))
}

Этот код возвращает: 8 или 10 или 6 как длину карты после цикла.Видео здесь , playgroud здесь .

Я вижу, что новые добавленные элементы входят в диапазон, но не могу объяснить, почему этот цикл останавливаетсяслучайным образом?

Ответы [ 2 ]

3 голосов
/ 28 марта 2019

Spec: Для заявлений:

Порядок итераций для карт не указан и не гарантируется, что он будет одинаковым от одной итерации к следующей. Если запись карты, которая еще не была достигнута, удаляется во время итерации, соответствующее значение итерации не будет создано. Если запись карты создается во время итерации, эта запись может быть создана во время итерации или может быть пропущена. Выбор может варьироваться для каждой созданной записи и от одной итерации к следующей. Если карта равна нулю, число итераций равно 0.

В спецификации говорится, что если вы добавляете записи на карту, на которую вы растягиваетесь, элементы, которые вы добавляете, могут или не могут посещаться циклом, и, более того, посещаемые объекты не являются даже детерминированными (могут измениться при повторном выполнении ).

0 голосов
/ 28 марта 2019

Вы изменяете карту, по которой вы перебираете.Это причина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...