Go: что определяет порядок итерации для ключей карты?

Спецификация языка программирования 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также печатает ключи в перемешанном порядке, но здесь порядок ключей зависитот порядка вставки.

Как все это реализовано? Является ли картаспециализированной для целых чисел и строк?

9
задан Martin Geisler 8 March 2012 в 15:06
поделиться