На Голанге почему итерации по картам случайны? - PullRequest
3 голосов
/ 30 апреля 2019

Из исходного кода Golang они, похоже, следуют довольно стандартной реализации хеш-таблиц (то есть массива блоков).Исходя из этого, кажется, что итерация должна быть детерминированной для неизмененной карты (т.е. итерировать массив по порядку, а затем итерировать по сегментам по порядку).Почему они делают итерацию случайной?

Ответы [ 2 ]

8 голосов
/ 30 апреля 2019

TL; DR; Они намеренно сделали это случайным, начиная с Go 1, чтобы разработчики не полагались на него (чтобы не полагаться на определенный порядок итераций, порядок которого может изменяться от выпуска к обращению, с платформы на платформу или даже может меняться в течение одной среды выполнения приложения, когда внутреннее содержимое карты изменяется из-за размещения большего количества элементов).

Блог Go: Карты Go в действии: Порядок итерации:

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

Также Go 1 Примечания к выпуску: перебор карт:

Старая спецификация языка не определяла порядок итераций для карт, и на практике она различалась для разных аппаратных платформ. Это привело к тому, что тесты, которые перебирают карты, были хрупкими и непереносимыми, с неприятным свойством, что тест всегда может проходить на одной машине, но не работать на другой.

В Go 1 порядок посещения элементов при итерации по карте с помощью оператора for range определяется как непредсказуемый, даже если один и тот же цикл запускается несколько раз с одной и той же картой. Код не должен предполагать, что элементы посещаются в каком-либо определенном порядке.

Это изменение означает, что код, который зависит от порядка итерации, с большой вероятностью сломается рано и будет исправлен задолго до того, как станет проблемой. Не менее важно, что это позволяет реализации карты обеспечить лучшую балансировку карты, даже когда программы используют циклы диапазона для выбора элемента на карте.

1 голос
/ 30 апреля 2019

Это важно для безопасности , между прочим.

Есть много ресурсов, говорящих об этом онлайн - смотрите это сообщение например

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