Спецификация языка программирования Go гласит:
3. порядок итерации по картам не указан. [...]
Этого следовало ожидать, поскольку тип карты может быть реализован как хэш-таблица, или как дерево поиска, или как некоторая другая структура данных. Но как на самом деле map
реализована в Go?
Иными словами, что определяет порядок итерации ключей в
for k, _ := range m { fmt.Println(k) }
Я начал задаваться этим вопросом после того, как увидел, что карта с string
ключами видимо doимеет определенную итерацию приказ. Программа типа
package main
import ("fmt"; "time"; "rand")
func main() {
rand.Seed(time.Seconds())
words := [...]string{"foo", "bar", "a", "b", "c", "hello", "world",
"0", "1", "10", "100", "123"}
stringMap := make(map[string]byte)
for i := range rand.Perm(len(words)) {
stringMap[words[i]] = byte(rand.Int())
}
fmt.Print("stringMap keys:")
for k, _ := range stringMap { fmt.Print(" ", k) }
fmt.Println()
}
выводит на моей машине следующее:
stringMap keys: a c b 100 hello foo bar 10 world 123 1 0
независимоот порядка вставки.
Эквивалентная программа с картой map[byte]byte
также печатает ключи в перемешанном порядке, но здесь порядок ключей зависитот порядка вставки.
Как все это реализовано? Является ли карта
специализированной для целых чисел и строк?